Steuerung für Heizungsunterstützung mit PV

Begonnen von ^Cobra, 11.03.2025, 18:07:33 CET

Vorheriges Thema - Nächstes Thema

pic18

was geht denn nicht, das Einlesen des Analogwertes? Umfasst die Schleife, welche die LED blinken lässt das ganze Programm oder ist es eine eigene Schleife.
Beim 18er läuft alles? Ist das Prog. noch so wie oben, ich werde es mir mal anschauen, muss aber erst das Datenblatt vom 16er studieren.

^Cobra

Hi pic18!
Die Schleife fürs blinken habe ich vor dem auslesen des analog Wertes reingemacht. 
Da beim 18f sich ja gar nichts am Anfang tat wollte ich wissen wie es beim 16f ist. Dieser blinkt aber an der Stelle. Auch wenn ich Kontroll Lampen an weiteren stellen mache, erkenne ich das das Programm soweit erstmal läuft. Aber die analog Spannung nicht eingelesen wird. Das Register ist laut den LEDs immer leer. Übrigens so,wie bei mein defekten 18f. Da war der Effekt übrigens auf bei an1.
Anscheind habe ich also den kompletten wanlder gekillt und nicht wie ich hoffte den Treiber für den Pin an0. 

der Code ist weitestgehend gleich geblieben. Wegen dem defekten Relais ist die Ansteuerung verdreht, ansonsten löscht der Schalter das state Register .Mehr ist noch nicht hinzugekommen.
Hole aber mein Laptop Mal gleich vor.

^Cobra

Zitat von: pic18 in 08.04.2025, 10:38:31 CESTich habe den alten C Compiler in MBLAB-X installiert. Mit xc8 laufen meine alten Programme nicht. Ich kann ja mal ein paar Bilder von meinem Projekt heute Abend schicken.


Habe nun mal nachgeschaut:
mpasm (5.87)und (5.54)sowie XC8 (2.45) sind bei mir installiert als Compiler.
War der XC8 der "alte" oder der neue C Compiler?

^Cobra

Zitat von: pic18 in 08.04.2025, 11:29:59 CESTwas geht denn nicht, das Einlesen des Analogwertes? Umfasst die Schleife, welche die LED blinken lässt das ganze Programm oder ist es eine eigene Schleife.
Beim 18er läuft alles? Ist das Prog. noch so wie oben, ich werde es mir mal anschauen, muss aber erst das Datenblatt vom 16er studieren.


Moin Pic18,
ich muss es zwar noch in meine PV Testplatine mal stecken, aber auf mein ProgrammBoard tut es nun wie es soll.
Ich hatte alles kontrolliert, bis auf mein Register PV_State. Dieser hatte willkürliches zeugs drin stehen. (gesehen durch ausgabe auf Portc.)
Und nun kommts: So wie beim P18F habe ich vergessen PV_State auf 0 zu inizialisieren -.-


pic18

läuft jetzt alles richtig?
Hier die versprochenen Bilder

^Cobra

Moin Pic18,
ja der 16F läuft nun auch. Danke für die Hilfe.
Dein C18 Compiler taucht in meiner Liste nur bei den 18F auf. Bei den 16F kann ich den also erst garnicht Auswählen.

Könntest du mir mal ein einfach Beispiel machen wo du in z.B. C Main eine Assambler geschriebene Datei ausführst?

also z.B. für ein Lauflicht habe ich in einer Datei sowas stehen:
loop   
    CALL Wait250
    CLRF STATUS
    RLF PORTC,f
    BTFSS PORTC,7
    goto loop
    CALL Taste
loop1   
    CALL Wait250
    CLRF STATUS
    RRF PORTC,f
    BTFSS PORTC,0
    goto loop1
    CALL Taste
    goto loop
    
Taste   
BTFSC PORTB,4
return
goto Taste

In einer anderen Assambler Datei steht für die Warte schleifen
; 1 Sekunde warten
WaitXS	
    movwf	WaitRSec	;in Temp2 steht wie viele Sekunden geartet werden soll
WaitS_loop
    CALL Wait250
    CALL Wait250
    CALL Wait250
    CALL Wait250
    decfsz  WaitRSec, F       ; alle s vorbei?
    goto WaitS_loop	
    return
    
;X ms warten 1-255ms einstellbar, Wert muss vohrer in W geladen sein
WaitX
	movwf	WaitRms
	goto	wai
	
; Warteschleife 250 ms
Wait250
	movlw	D'250'		; 250 ms Pause
	movwf	WaitRms

; Warteschleife, Anzahl der Millisekunden steht in loops
wai
	movlw	Cloop;.110           ; Zeitkonstante für 1ms berechnung 0,001ms/(1/(Fcyc/4)*SchleifenZyklen)
        movwf   WaitRus
Wai2    nop                    ; 
        nop
        nop
        nop
        nop
        nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
        decfsz  WaitRus, F      ; 1 ms vorbei?
        goto    Wai2           ; nein, noch nicht
        decfsz  WaitRms, F       ; alle ms vorbei?
        goto    wai            ; nein, noch nicht
        RETLW   0              ; das Warten hat ein Ende

;**************************
	END                    ; directive 'end of program'

Wenn ich jetzt ein neues Projekt anlege, Da den C18 Compiler nehme, mir eine C MainFile hinzufüge, ist dieser nichtmal Fehlerfrei.
cMainProjekt.PNG
Wie kriege ich es nun hin das mein C Projekt 1. überhaupt Übersetzbar ist. 2. meine Assambler Files ausgeführt werden können?



pic18


Zitat von: ^Cobra in 09.04.2025, 10:42:31 CESTDein C18 Compiler taucht in meiner Liste nur bei den 18F auf. Bei den 16F kann ich den also erst gar nicht Auswählen.
kein sein, dass dieser nur für den 18er ist. 

Hier ein Beispiel:
das C- Unterprogr. void ds18b20int (void) wird über timer im Hauptmenu aufgerufen. 
in der case - Verzweigung  ds18b20ToutInit_LCD wird das Assemblerprogr. float4li(get0,sr_1) aufgerufen. Welches die Temperaturwerte des Fühlers für die LCD Ausgabe aufbereitet und als String_Pointer zurückliefert.
Später wird mit LCD_string(sr_1) der Temperaturwert mit Kommastellen auf die Anzeige gebracht.

Im Assemblerprogr. habe ich mit MOVFF FSR2L, POSTINC1 usw die Parameter die umgewandelt werden sollen übernommen. 

sw18b20.zip

^Cobra


^Cobra

Hallo pic18,
habe mir dein Beispiel angeschaut.
Habe zwar deine beschriebenen Punkte gefunden, aber leider verstehe ich es dennoch nicht.
1. Ist dein Beispiel mit so viel anderes nichts sagendes vollgestopft, dass ich ehrlich gesagt null durchblick habe
2. Das Projekt ist nicht Übersetzbar, nicht mal ansatzweise da viele Dateien fehlen.
3. Ich habe gesehen das in dem ASM File die Variable extern zur Verfügung gestellt wurde. Kann aber nicht finden wo sie als Global deklariert ist.
Dein C Code Ruft irgendwann float4li(get0,sr_1) auf und fertig.

4. Nach lagem rum basteln nun die Lösung:
 => Mein Projekt ließ sich nicht Übersetzen da in meiner C Vorlage, welche von Microchip daher kommt kurz gesagt Müll drin steht.
Ich habe durch hier und da lesen mal was anderes hingeschrieben:
#pragma code 
void main(void) {

}

Das konnte man zumindest übersetzen.
Dann habe ich hier nun bisschen C mäißges rein gebastelt:
void AsmLoop (void);
/** D E C L A R A T I O N S **************************************************/ 
#pragma code 
void main(void) 
{ 
  LATB = 0x00;  
  TRISB = 0xFE;

  while(1) 
  { 
    LATB = 1; 
    Delay10KTCYx(100); 
    LATB = 0; 
    Delay10KTCYx(100); 
    AsmLoop();
  }//end while 
}//end main

Die Config ,Delay Lib und die Pic Inc datei habe ich weiter oben eingebunden:
#include <stdio.h>
#include <stdlib.h>

/** I N C L U D E S **********************************************************/ 

#include "delays.h"                        // für die Warteschleife 
 
/** Configuration ********************************************************/ 
#include <p18F14K22.h>

// CONFIG1H
#pragma config FOSC = IRC       // Oscillator Selection bits (Internal RC oscillator)
#pragma config PLLEN = OFF      // 4 X PLL Enable bit (PLL is under software control)
#pragma config PCLKEN = ON      // Primary Clock Enable bit (Primary clock enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRTEN = OFF     // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 19        // Brown Out Reset Voltage bits (VBOR set to 1.9 V nominal)

// CONFIG2H
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config HFOFST = OFF     // HFINTOSC Fast Start-up bit (The system clock is held off until the HFINTOSC is stable.)
#pragma config MCLRE = OFF      // MCLR Pin Enable bit (RA3 input pin enabled; MCLR disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config BBSIZ = OFF      // Boot Block Size Select bit (1kW boot block size)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block not protected from table reads executed in other blocks)

Nun mein Spannenderteil:
die Funktion   AsmLoop(); ist in einer anderen Datei, welche in Assambler geschrieben ist.
   global AsmLoop 
ASM_Code CODE                      ; let linker place main program

AsmLoop:

    GOTO AsmLoop                          ; loop forever

    END

Und hier springt der auch in der Sim rein und bleibt für ewig dadrin >:D .

Danke dir pic18 für die Hilfe. Auch wenn ich bei dir weder ein Prototyp noch eine extern deklaration finden konnte, so kam ich auf die Idee des Prototyps, und mit dem hat dann funktioniert. Ob ich jetzt auf C umsteige? Wohl kaum... alleine das ich hier 2 .h einbinden musste welche für mich nichts sagend sind... weiß schon nicht mehr wo ich das gelesen,gehört oder geahnt habe... Auch wenn ich mir anschaue was jetzt an Speicher schon verbraucht wurde. Klar, wenn ich mir dein Code anschaue will ich das ganze nicht in Assambler nach bilden müssen, aber meine einfachen Projekte sind bis jetzt nach machbar. Werde aber am Ball bleiben und das ein oder andere in C weiter Testen.

Gruß
Cobra

pic18

Zitat von: ^Cobra in Gestern um 14:41:01 CESTDas Projekt ist nicht Übersetzbar, nicht mal ansatzweise da viele Dateien fehlen.
Das ist richtig, da es ein sehr großes Programm ist. Es gibt sehr viele Unterprogramme die auf einander zugreifen. Außerdem habe ich viel über Interrupt gesteuert, da ich so gut wie keine Zeitschleifen benutzt habe, um eine gute Performance zu haben. Ich habe leider im Moment kein einfaches Beispiel zur Hand.

Im Assemblerprogramm gebe ich float4li bekannt
und benutze ein externes Unterprogr. LCD_Out, welches ich in C dekariert habe

global float4li
extern LCD_Out

dem C-Compiler sage ich, dass ich ein externes Programm (float4li) habe, welches 2 Pointer vom Type char hat.
sr_1[10] und  get0[10] sind Pointer (Zeiger) vom Typ char mit 10 Zeichen

extern void float4li(char *get, char *erg);   
char sr_1[10]; // für ASCII Anzeige ("-012.3456";)     
char get0[10]; //scratchpad RAM (temp LSB, temp MSB, TH, TL, Config,rev5678, CRC)

die Parameter (Pointer) übergebe ich mit
float4li(get0,sr_1)

Im Assemblerprogramm lese ich übergebenen Daten aus.
    ;Stk2PushFromReg FSR2L        FSR2 sichern
    MOVFF FSR2L, POSTINC1
    MOVFF FSR2H, POSTINC1

    ;Stk2CpyToReg -6,FSR2L        zeiger ASCII_string nach FSR2
    MOVLW 0xfa
    MOVFF PLUSW1, FSR2L
    MOVLW 0xfb
    MOVFF PLUSW1, FSR2H

    ;StkCpyToReg -4,FSR0L        Wert Get_imput nach FSR0
;    movlb merker                        
;    SETF merker,BANKED    ;movlw 0xff
;    RCALL p_to_fsr0
    MOVLW 0xfc
    MOVFF PLUSW1,FSR0L
    MOVLW 0xfd
    MOVFF PLUSW1,FSR0H

    MOVFF POSTINC0,POSTINC1    ;get_lo zwischenspeichern
    MOVFF POSTDEC0,INDF1;    POSTINC1    ;get_hi

Das mag etwas kompliziert sein, aber dadurch kann ich direkt von C die Daten ohne eine Dauerhafte Variable zu generieren übergeben.

Zitat von: ^Cobra in Gestern um 14:41:01 CESTUnd hier springt der auch in der Sim rein und bleibt für ewig da drin
ist klar, du hast hier eine Endlosschleife AsmLoop: goto AsmLoop
Zitat von: ^Cobra in Gestern um 14:41:01 CEST2 .h einbinden musste welche für mich nichts sagend sind
Welche Header Datei meinst Du. Durch einbinden der Header Datei erklärst Du dem Compiler was Du noch alles einfügst. Dies kann Intern sein, oder auch eigenen Programmteile.

Zitat von: ^Cobra in Gestern um 14:41:01 CESTWerde aber am Ball bleiben und das ein oder andere in C weiter Testen
Bei größeren Programmen wird es schwer alles in Assembler zu schreiben. Da benötigst Du eine Hochsprache. Wenn ich nur überlege, irgendwelche Rechenoperationen durchzuführen. Einfache Sachen habe ich früher auch in Assembler geschrieben, da du oft einfache Befehle nehmen kannst. Zum Beispiel ein Bit setzen (BSF..), in C musst Du dann eine Oder -Verknüpfung nehmen und bei löschen eines Bits (BCF..) eine Und -Verknüpfung.

^Cobra

Zitat von: pic18 in Gestern um 22:37:03 CEST
Zitat von: ^Cobra in Gestern um 14:41:01 CEST2 .h einbinden musste welche für mich nichts sagend sind
Welche Header Datei meinst Du. Durch einbinden der Header Datei erklärst Du dem Compiler was Du noch alles einfügst. Dies kann Intern sein, oder auch eigenen Programmteile.

Ich meinte diese hier:
#include <stdio.h>
#include <stdlib.h>

Danke für deine Erklärung. Verzeih mir noch eine Frage: wo ist die Schnittstelle zwischen dein in c vergebenen pointern und im assamblercode? Die Bezeichnung finde ich zumindest nicht wieder 

pic18

<stdio.h>
<stdlib.h>
Das sind fertige Bibliotheken vom C-Compiler, erkennst Du am "< >"
wahrscheinlich werden diese bei Deinem kurzen Prog. nicht benötigt.

Die Datei stdio.h enthält diverse Standard-Input-Output-Funktionen (daher der Name)
https://www.proggen.org/doku.php?id=c:lib:stdio:start 

stdlib Standard Library
https://www.proggen.org/doku.php?id=c:lib:stdlib:start

Zitat von: ^Cobra in Gestern um 23:02:39 CESTwo ist die Schnittstelle zwischen dein in c vergebenen pointern und im assamblercode

float4li(get0,sr_1)

damit rufe ich das Assemblerprog. auf und übergebe die zwei Pointer, wobei der zweite die Rück-Antwort ist.
Der C-Compiler schiebt die Adressen in das File Select Register (FSR), dieses lese ich im Assemblerprog. aus.
Man kann dies auch anders machen, in dem ein Assemblerprogr. ohne Parameter aufruft, und die Parameter im Assemblerprog. als extern definiert. Dann muss natürlich auch float4li auch ohne Parameter definiert werden.
void float4li(void)


Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

🡱 🡳