Neueste Beiträge

#21
P
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von pic18 - 07.04.2025, 14:12:08 CEST
Zitat von: ^Cobra in 07.04.2025, 12:17:39 CESTDer 18F mag wohl die in der Doku verwendete sprung methode nicht. $-1 

der 18er hat eine andere Adressierung, da besteht ein Befehl aus zwei Byte, GOTO $-2 sollte dann gehen. Der Goto-Befehl besteht sogar aus zwei Worte = 4 Byte.
Der zweite Teil von Goto fängt mit NOP an, gefolgt von der Sprungadresse. Falls man aus versehen auf die zweite Hälfte trifft, passiert also nichts.
Auch die Interrupt-Adresse ist anders statt 0x0004 jetzt 0x0008, es gibt sogar zwei Interrupt einen HI und einen Lo 0x0018
#22
O
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von Ottmar - 07.04.2025, 13:38:55 CEST
Hi cobra,
ich komme nochmals auf das banking vom 16f690zurück.
Nach dem Programmstart ist Bank 0 aktiv.
OSSCON liegt aber in Bank 1
dann würde die Osc.config 500kHz ins Leere gehen.
Erst danach schaltest Du mit
BANKSEL TRISC auf Bank 1 um.

vielleicht hilft's
drück Dir die Daumen
#23
^
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von ^Cobra - 07.04.2025, 12:17:39 CEST
wieder ein Schritt weiter.
Der 18F mag wohl die in der Doku verwendete sprung methode nicht. $-1 
Dafür namen gegeben und nun kann ich übersetzen und debuggen.
Dabei ist mir nun was aufgefallen:
in mein Register PV_State kann ich weder löschen, noch schreiben o.O muff.
Ebenfalls laufen meine Zeitschleifen irgenwie garnicht oder sehr langsam, da bin ich noch am schauen.
#24
^
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von ^Cobra - 07.04.2025, 10:58:08 CEST
seufz,
guten morgen.

Die Gute Nachricht: Bin nun eine Woche krank geschrieben und dank Laptop und TestKoffer kann ich auf dem Sofa oder Bett weiter Forschen.

Habe nun ein 18F14K22 gefunden, dieser ist Pingleich mit dem 16F690. Mein Gedanke war es damit debuggen zu können um besser die Probleme zu finden.
Allerdings schaffe ich es nicht das Projekt auf dem 18F ans laufen zu kriegen.
Habe alle Fehler weg bekommen bis auf diesen:
Error - file './build/default/production/Main.o', section 'Haupt', Symbol '_Haupt_002A' is not word-aligned.
It can not be used as the target of a call or goto instruction.
Errors    : 1
Verstehe aber nicht was der mir sagen will. Der Main teil wird nicht mit CALL oder GOTO aufgerufen.
Kennt das jemand? Würde ja 2 " word-aligned " machen, aber finde auch da nicht wo oder wie ich das machen soll.   Bei mein anderen 18F steht da auch nichts anderes...
#25
^
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von ^Cobra - 06.04.2025, 21:14:17 CEST
Moin Ottmar, da stand vorher Mal nix drin also fosc/2, da ich aber den internen oszi nutze hatte ich gedacht das der dann auch auf intern stehen muss.
Werde aber Mal da was anderes versuchen. Aber erst morgen. 
Nun erstmal schlafen und schauen wies mir morgen geht.

Habe übrigens schon ein anderen 16f690 genommen. Selbe Ergebnis.
Kann mich nicht erinnern schonmal Probleme mit analog Zeugs in der Form gehabt zu haben.
Auch das die Routine mit der Prüfung auf z nun nicht geht... Seltsam bis frustrierend 
#26
O
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von Ottmar - 06.04.2025, 19:52:44 CEST
Hi cobra,
Verwendest Du den sleepmode? Wenn nicht würde ich den Versuch machen in ADCON1 nicht frc sondern z.B. fosc/16 o.ä. zu verwenden.
#27
^
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von ^Cobra - 06.04.2025, 17:55:06 CEST
Moin Ottmar,

danke fürs drüberschauen.

zu 
a) : Doch, banksel WPUB bringt mich in die Bank 2, da ist dann auch ADCON1 sollte also passen.

b) TRISA ist bei Reset immer gesetzt und somit sind es bereits eingänge.

c) nope, benutzt nur die 8 bits vom Highteil, da ist rechts bündig angenehmer ;)
#28
O
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von Ottmar - 06.04.2025, 17:18:34 CEST
Hi cobra
a) mir fällt auf, dass keine Bankumschaltung verwendet wird!
b) AD-channel ist RA0/AN0:RA2/AN2
Diese pins müssen als inputs in TRISA und in ANSEL als analog konfiguriert sein.
c)in ADCON0 würde ich bit7=1 setzen, für Result right justfied.

Vielleicht hilft's
MfG Ottmar

#29
^
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von ^Cobra - 06.04.2025, 16:33:34 CEST
Nachtrag: Auch meine Art der Auswertung funktioniert scheinbar nur in der
simulation...
Habe nun die Analog spannung erstmal bei seite geschoben und den Rest überprüfen wollen.
Beim AutoEIN schalter kam aber nichts. Habe dann HW und SW nochmal überprüft.
HW alles OK - SW - mit ein Testprogramm konnte eine LED eingeschaltet werden
bei mein Code wird mit ein SUBLW die bits abgezogen die an sein müssen, wenn ergebnis 0 ist, somit das Z
Flag gesetzt ist wird also dahin gesprungen zum einschalten. genau das passiert aber im "echten" pic einfach nicht :(
Wenn ihr da ebenfalls ideen habt, gern her damit...
#30
^
Mikrocontroller / Aw: Steuerung für Heizungsunte...
Letzter Beitrag von ^Cobra - 06.04.2025, 14:54:12 CEST
Moin Männers!

Ich habe nun mal "auf die schnelle" ein Programmteil geschrieben, im simulator siehts gut aus.

Heute also fix eine Lochrasterplatine zusammen gezimmert und - geht nicht.
Der Analogwandler will einfach nicht.
Ich finde einfach den Grund dafür nicht. Hoffe da auf eure Tipps.

der Pic ist ein 16F690. Leider unterstützt dein kein direktes debuggen. Zumindest sagt das mein mplab.
Es wird der interne Takt benutzt.

für den Analogteil wären denke das die wichtiges Code ausschnitte:
     Banksel TRISC
    clrf TRISC     ;Port C Ausgänge
    movlw B'00110000'
    movwf ADCON1
   banksel WPUB
    movwf WPUB
    movlw b'00001111' ;RA0-RA2 u RA4 Analog, RC0-RC3 Digital
    movwf ANSEL

;Akuuspannung messen
    movlw b'00000001' ; A/D wandler einschalten, AN= aktiv, VDD als Vref, messung starten
    movwf ADCON0
    movlw d'50'
    CALL WaitX	;50ms warten
    BSF ADCON0,GO ;Start conversion
    BTFSC ADCON0,GO ;Is conversion done?
    GOTO $-1 ;No, test again
    movfw ADRESH    ; Akku Spannung messen 
    movwf Temp0	;

der Teil mit dem Englischen Kommentar war der letzte einfall (von der Doku), leider auch das ohne erfolg.
In der Simulation kann ich eine Spannung an dem pin AN0 anlegen und diese wird auch gemessen.
Verstehe einfach nicht was hier nun fehlt.

Der Gesamt Code wäre hier:
; Example of using GPR Uninitialized Data
;
GPR_VAR        UDATA
Temp0         RES        1      ; User variable linker places
Temp1         RES        1      ; User variable linker places
Temp2         RES        1      ; User variable linker places
PV_State      RES	 1	; Status Register von der PC Steuerung 
	 ;
;   ; Example of using Access Uninitialized Data Section (when available)
;   ; The variables for the context saving in the device datasheet may need
;   ; memory reserved here.
;   INT_VAR        UDATA_ACS
;   W_TEMP         RES        1      ; w register for context saving (ACCESS)
;   STATUS_TEMP    RES        1      ; status used for context saving
;   BSR_TEMP       RES        1      ; bank select used for ISR context saving
;
;*******************************************************************************

; TODO PLACE VARIABLE DEFINITIONS GO HERE

;*******************************************************************************
; Reset Vector
;*******************************************************************************

RES_VECT  CODE    0x0000            ; processor reset vector
    GOTO    START                   ; go to beginning of program

;*******************************************************************************
; TODO Step #4 - Interrupt Service Routines
;
; There are a few different ways to structure interrupt routines in the 8
; bit device families.  On PIC18's the high priority and low priority
; interrupts are located at 0x0008 and 0x0018, respectively.  On PIC16's and
; lower the interrupt is at 0x0004.  Between device families there is subtle
; variation in the both the hardware supporting the ISR (for restoring
; interrupt context) as well as the software used to restore the context
; (without corrupting the STATUS bits).
;
; General formats are shown below in relocatible format.
;
;------------------------------PIC16's and below--------------------------------
;
ISR       CODE    0x0004           ; interrupt vector location
;
;     <Search the device datasheet for 'context' and copy interrupt
;     context saving code here.  Older devices need context saving code,
;     but newer devices like the 16F#### don't need context saving code.>
;
;     RETFIE
;
; TODO INSERT ISR HERE


;*******************************************************************************
; MAIN PROGRAM
;*******************************************************************************

       #include GeneralConfigs.inc
; CONFIG
; __config 0x3FCC
 __CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF
 
 
#Define StatusLED   PORTC,0
#Define Relais	    PORTC,1
#Define ErrorLED    PORTC,2
#Define AkkuVolt    PORTA,0 ;BereitMeldung PV Akku und Heizung bereit zum zuheizen
#Define Temperatur1 PORTA,1 
#Define EIN_Taster  PORTB,4
#Define AkkuVoltOK  PV_State,0 ;Akku ist so gut wie voll und Heizung ist aufnahme bereit
#Define AkkuTempOK  PV_State,1
#Define AutoON	    PV_State,2 
    extern WaitX
    global Temp0,Temp1,Temp2 

MAIN_PROG CODE                      ; let linker place main program
START
;IO Config setzen
    bsf OSCCON,SCS  ;internen takt benutzten
    clrf PORTC
    Banksel TRISC
    clrf TRISC	    ;Port C Ausgänge
    movlw B'00110000'
    movwf ADCON1
    movlw b'11110000' ; Pull UP für RB4-RB7 ON
    banksel WPUB
    movwf WPUB
    movlw b'00001111' ;RA0-RA2 u RA4 Analog, RC0-RC3 Digital
    movwf ANSEL
    clrf ANSELH	;RB4-5 und RC 6-7 Digital IO 
 
    BCF STATUS,RP0 ;Bank 0
    BCF STATUS,RP1
    bcf AkkuVoltOK
        
StartWait
    CLRWDT  ;Watchdog zurück setzen
    bsf StatusLED ; LED einschalten -> Spannung liegt an
 
;Akuuspannung messen
    movlw b'00000001' ; A/D wandler einschalten, AN= aktiv, VDD als Vref, messung starten
    movwf ADCON0
    movlw d'50'
    CALL WaitX	;50ms warten
    BSF ADCON0,GO ;Start conversion
    BTFSC ADCON0,GO ;Is conversion done?
    GOTO $-1 ;No, test again
    movfw ADRESH    ; Akku Spannung messen 
    movwf Temp0	; 
    ;   
; Spannungsteiler wird so eingestellt das bei 32V 5V am Pic ankommen 
;es ergeben sich diese Spannungen
;5V/1024 => 0,0048828125 ca 0,005v => ein digit
;32V => 5V
;28V=>5V/32*28=>4,375	- start spannung
;22V=>5/32*22=>3,43	- stopp spannung

;5V=> 1024 
;4,37=>1024/5*4,375=> 896 => 11100000/00 (224) 0xE0	-start Wert D'224' nur High in klammer
;3,43=>1024/5*3,43=> 702=> 10101111/10 (175) 0xAF	-stopp Wert D'175' nur High in klammer

  ;einschalten 
  bsf STATUS,C	;Carry bit setzen
 SUBLW d'224' ; Startwert-akku Spannung wenn Akkuspannung > startwertist carry bit false

  btfss STATUS,C ;überspringe nachfolgenden wenn gesetzt
  bsf  AkkuVoltOK
  
 ;ausschalten
  movfw Temp0
  SUBLW d'175' ; Startwert-akku Spannung wenn Akkuspannung > Endwert ist carry bit false

  btfsc STATUS,C ;überspringe nachfolgenden wenn gesetzt
  bcf  AkkuVoltOK 
  
  ;Schalter Automatik EIN
  BCF AutoON
  BTFSS EIN_Taster ;//Wenn Schalter belegt bit = False
  bsf AutoON
  
  ;Freigabe heizen zusammen legen
  movfw PV_State
  SUBLW B'00000101'
  BTFSS STATUS,Z 
  goto RelaisOFF
  goto RelaisON
  
RelaisON  
  bsf Relais
  goto StartWait
  
RelaisOFF  
  bcf Relais
  goto StartWait  
    END
wäre euch sehr dankbar wenn ihr da noch eine Idee habt...

hustene grüße (scheiß Erkältung)
Cobra
🡱 🡳