Forum: Mikrocontroller und Digitale Elektronik Setzen des GIE-Bits nach EEPROM Schreibvorgang (PIC18F4550)


von Jack (Gast)


Lesenswert?

Hallo Community

Meine Subroutine zum Beschreiben des EEPROMs sieht so aus:
1
void write_eeprom1(unsigned char Address, unsigned char Data)
2
{
3
  EEADR = Address;
4
  EEDATA = Data;
5
  WREN = 1;
6
  GIEH = 0;    
7
  _asm
8
  //Der Assembler-Teil wurde direkt aus dem Datenblatt übernommen
9
  MOVLW 0x55
10
  MOVWF EECON2, 0
11
  MOVLW 0xAA
12
  MOVWF EECON2, 0
13
  BSF EECON1, 1, 0    //Führt den Schreibvorgang aus
14
  _endasm  
15
  while(WR);  //Auf das Ende des Schreibvorganges warten
16
  GIEH = 1;
17
  WREN = 0;
18
}

Bei dem Code hängt sich der PIC allerdings bei der Zeile
"GIEH = 1"
auf, das heisst er besitzt 0% Funktionalität (weder Interrupts noch 
main), bis der Watchdog greift.

Wenn ich die obengenannte Zeile streiche, funktioniert alles 
einwandfrei.
Es kommt für mich aber nicht in Frage, das Setzen des Bits dem 
USB-Framework zu überlassen.

Fällt euch etwas auf, das falsch ist / sein könnte ?

Grüsse
Toubi

von Joachim .. (zinnkruemel)


Lesenswert?

Hmmm. Hab gerade den Code im Datenblatt mit dem deinigen verglichen und 
kann nichts ungewöhnliches feststellen. Auch im Datenblatt wird das Bit 
unmittelbar vor der Schreibroutine weggenommen. Aber vielleicht 
unterscheidet sich der Code den C18 erzeugt von dem was im Datenblatt in 
Assembler steht. Kuck dir dooch mal das Disassembler-Listing an.

Was passiert denn wenn du die Anweisung etwas weiter oben ausführst?



Hab zur Zeit den 4550 + Encoder auf dem Steckbrett und benutze die 
Interrupt-on Change PINs an PB4 u.5. Wenn ich vor der ISR das GIEH bit 
setze, verschwindet es während des Interrupts und wird nicht wieder 
gesetzt. Ich muß es in der main loop permanent setzen. Ich kenne dieses 
Phänomen vom alten 452 nicht. Auch n Ding.

von Jack (Gast)


Lesenswert?

Problem gelöst.
In der Init-Funktion des Timer 0 war die Zeile
1
RCONbits.IPEN = 1
auskommentiert.

Die Folge:
Zum Zeitupnkt des ersten EEPROM-Beschreibvorganges wurde GIEH zum ersten 
Mal gesetzt, TMR0-Interrupt hatte auch noch hohe Priorität aber in der 
HighPriorityInterrupt-Subroutine wurde das TMR0IF nicht gelöscht -> 
Prozessor hängt fest.

Hat meinen ICD3 einige Arbeit gekostet, das rauszukriegen :D

Liebe Grüsse und auf ein nächstes
Toubi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.