- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: PIC16F84A - CALL Problem - Programm Counter schuld?

  1. #11
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    75
    Beiträge
    2.063
    Anzeige

    Praxistest und DIY Projekte
    MOVLW gLeft lädt die Adresse von (Literal) gLeft in das W-Register,
    MOVFW gLeft lädt den Inhalt von (FileRegister) gLeft in das W-Register.
    Du kannst GOTO und Sprungziele in der Tabelle einsetzten, kannst aber auch, wie ich bereits vorgeschlagen hatte, eine Tabelle mit RETLW und den Register-Adressen (Labelnamen) aufbauen und nach dem Rücksprung mit indirekter Adressierung (FSR und INDF) den Inhalt aus der Adresse auslesen oder reinschreiben Beispiel.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  2. #12
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    Hallo t0b4d!

    Zitat Zitat von t0b4d
    wenn ich den PCLATH verändere, wird er nach dem Zeilenaufruf der Tabelle (zb. RETLW gStatus) wieder durch das RETURN zurückgestellt ?
    Ja, der PCH (durch PCLATH) muss vor jedem Aufruf einer Tabelle neu definiert werden. Dank dessen, kann man verschiedene Tabellen mit "retlw" und "goto" abwechselnd aufrufen.

    Übrigens, wegen anderer Speicherorganisation, wird bei PIC16FXXX meine Sprungtabelle an ORG 0x(PC-1) und nicht wie bei PIC18FXXX an ORG 0x(PC-2) anfangen, da der Befehl "addwf PCL,1" bei PIC16FXXX ein Byte und bei PIC18FXXX zwei Bytes lang ist. Das betrifft nur Sprungtabellen die 256 Bytes (für PIC16FXXX) oder 128 Words (für PIC18FXXX) lang sind.

    Für kürzere Sprungtabellen ist es nur erforderlich, dass die ganze Tabelle sich auf gleicher Seite (Page) des Speichers befindet (wegen PCH).

    MfG

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    07.01.2007
    Beiträge
    27
    So ich bins mal wieder,
    hab mir die indirekte Adressierung angeschaut und hab noch eine Frage dazu.

    Wenn ich in der "dynamischen Tabelle" neben Fileregistern auch konstante Werte ins Workregister schreibe, kommt es dann zu Problemen wenn ich die Senderoutine nehme:

    Code:
    UP_MAX_send_tabelle
    	
    	MOVLW	D'1'
    	MOVWF	zaehler_tab
    	
    MAX_st1	MOVLW	D'8'
    	MOVWF	zaehler_bit
    	
    	CALL	tab_MAX		;Öffnet die "dynamische Tabelle"
    				;Im Workregister steht jetzt die Adresse
        				;des Registers dessen Inhalt Übertragen werden soll
    			     	
    	MOVWF	FSR		;der Zeiger zeigt jetzt auf das Register
    				;dessen Inhalt Übertragen werden soll
    				
    	MOVFW	INDF		;mit dem virtuellen Register INDF kann der
    				;Inhalt des Registers ausgegeben werden,
        				;auf das der Zeiger FSR zeigt
    	MOVWF	sMAX
    	
    	BCF	a_MAX_LOAD	;Vor der Übertragung von 2 Bytes auf LOW
    	
    	
    MAX_st2	RLF	sMAX		;MSB zuerst...
    	BTFSC	STATUS,C
    	GOTO	MAX_send_tabelle_1	;MAX-Datenleitung auf HIGH	(Übertrage 1)
    	BCF	a_MAX_DATA		;MAX-Datenleitung auf LOW	(Übertrage 0)	
    	
    MAX_st3	BCF	a_MAX_CLOCK	;
    	;CALL	UP_wait_05s	; #############DEBUGGING#############
    	BSF	a_MAX_CLOCK	;Positive Flanke erzeugen
    	BCF	a_MAX_CLOCK
    	
    	DECF	zaehler_bit
    	MOVF	zaehler_bit,F	; Zähler ...
    	BTFSS	STATUS,Z		; ... auf 0 prüfen,
    	GOTO	MAX_st1		; <-- Zähler != 0
    	BTFSS	zaehler_tab,0	; <-- Zähler == 0
    	BSF	a_MAX_LOAD	; <-- Zähler_tab == gerade
    				; <-- Zähler_tab == ungerade
    	INCF	zaehler_tab
    	MOVLW	D'22'
    	SUBWF	zaehler_tab,W
    	BTFSS	STATUS,Z		
    	GOTO	MAX_st1		;zaehler_tab < 22
    	RETURN			;zaehler_tab = 22
    	
    MAX_send_tabelle_1
    	BSF	a_MAX_DATA
    	GOTO	MAX_st3
    Er sieht ja dann den konstanten Wert als Adresse an und ließt den Inhalt aus dieser Adresse im Fileregister aus.
    Also müsst ich alle konstanten Werte die ich in der Tabelle hab im Fileregister anlegen und in der Initialisierung mit den vorgesehenen Werten belegen.

    Ich hab dieses Unterprogramm geschrieben um an dem MAX-7219 die gewünschten Register anzeigen zu lassen. Da aber die Initialisierung und die Adressen der einzelnen Digits immer gleich ist, hat ich für diese Bytes Konstanten vorgesehen.

    ...Aber das is ja kein Thema wenn ich mit der Senderoutine keine konstanten Werte mehr übertragen kann. Dann mach ich es einfach wie oben beschrieben....

    Edit: Kommentierung im Quellcode

  4. #14
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    75
    Beiträge
    2.063
    Wenn Du in der Tabelle Konstanten und FileRegister-Adressen gemischt einsetzen möchtest, kommst Du mit 8 Bits nicht aus.
    Wenn der PIC16F84A 4 Registerbänke hat, muß das Bit IRP zur Bestimmung von Registerbank 0 und 1 bzw. 2 und 3 gesetzt werden. Es sei denn, Du setzt dieses Bit in der Subroutine grundsätzlich auf 0 und benutzt nur die Register-Bank 0 und 1.
    Sonst benötigst Du 9 Bits in der Tabelle für die FileRegister.
    Zwischen Konstante und FileRegister unterscheiden kannst Du dann immer noch nicht; ein weiteres Bit muß her. Dann sind es 10 Bits.
    Im Flash-Speichers geht das, da kannst Du mit LOW() und HIGH() das Low- und High-Byte auslesen, wobei das High-Byte KEINE 8 Bits hat.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    07.01.2007
    Beiträge
    27
    Ich lass das mit den Konstanten sein, weil das mir dann doch zu aufwendig ist.

    Aber ich hab eine Frage zu den "Bänken" die Du erwähnt hast. Im PIC16F84 Datenblatt steht:

    01 = Bank 1 (80h - FFh)
    00 = Bank 0 (00h - 7Fh)

    In der Bank 1 werden doch die Ein- und Ausgänge festgelegt?

    Kann ich in der Bank 0 und 1 jeweils 128 Register festlegen?

    Ich brauch ca. 50 Register, also leg ich die am Besten in Bank 0 an. Dann brauch ich auch kein 9. Bit (IRP Bit).

    Der Haken daran ist, dass das Register FSR (wie alle Register) nur 8 Bit lang ist, wärend wir bekanntlich im PIC mit 9-Bit Adressen arbeiten (2 bit zur Bankauswahl, 7 Bit zur Adressierung innerhalb der Bank). Der PIC ergänzt daher die 8 Bit (aus dem FSR) zu einer vollständigen Adresse, indem er davor das Bit IRP aus dem STATUS-Register setzt.

    Will man auf Speicher in den Bänken 0 und 1 zugreifen muß also IRP gelöscht (=0) sein, will man dagegen auf die Bänke 2 und 3 zugreifen, muß man vorher IRP setzen (=1).

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    75
    Beiträge
    2.063
    Im Datenblatt sind alle benutzten FileRegister in den Bänken 0 und 1 aufgelistet. Dort kannst Du auch sehen, welche Register noch frei sind.
    Ich empfehle Dir, nur RegisterBank 0 zu benutzen; bei Zugriffen auf Register in Bank 1 mußt Du sonst immer auf Bank 1 umschalten, das Register ansprechen und wieder auf Bank 0 zurück schalten (so wie bei der Initialisierung z.B. mit den TRIS-Registern)
    Bei der indirekten Adressierung ist das Umschalten auf RegisterBänke anders geregelt; für Bank 0 und Bank 1 muß IRP gelöscht sein, für Bank 2 und 3 gesetzt. Da es bei Dir nur die RegisterBänke 0 und 1 gibt, muß da wohl weiter nichts umgeschaltet werden.
    Das solltest Du im Datenblatt noch mal nachschlagen, den PIC16F84 kenne ich nicht, ich benutze hauptsächlich den PIC16F877.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    07.01.2007
    Beiträge
    27
    Bild hier  

    Also 68 Register (von 0x0C bis 0x4F) kann ich in der Bank 0 speichern!

    Hab das Problem mit der Tabelle behoben, in dem ich die Tabelle ab Speicherblock 0x300 speichere!

    Jetzt schreib ich nur noch eine umkehr Funktion (ich lese zZ. die Register durch die Tabelle aus) um mit einer anderen Tabelle in die Register zu schreiben, so das ich so wenig Code wie möglich hab.


    just, t0b4d

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen