Forum: Mikrocontroller und Digitale Elektronik 8051 Timer ISR toggelt keine 2 Ports


von MikroMakro (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Spezialisten.
Ich bin daran einer scheinbar einfachen Aufgabe zu scheitern.
(Code im Anhang)

Controller: AT89C51ED2 (wird seit 4 Jahren hin und wieder auf 
SelbstbauDevBoard verwendet)

In meiner Timer 0 ISR sollen 2 PortPins, nach 10 Timerüberläufen, 
getoggelt werden.
point0 und point1 sind die PortPins.
Werden point0 und point1 compiliert geht nix. Ports bleiben aus.
Wird nur eine von beiden compiliert, wird dieser einwandfrei getoggelt.

Ich habe diesen kleine CodeSchnippsel in vielen Varianten probiert.
Nix zu machen.
Es kam auch schon vor das 2 andere Ports im Wechsel blinkten. :(

Woran kann das leigen?
Datentransport in Controller schlecht?
Interuptauslöse?

Danke im Voraus Mi

von MikroMakro (Gast)


Lesenswert?

Sorry, dass

P1=~0xfc;

gehört dort nicht hin.
Sonst alles wie im 1. Text beschrieben.

von Matthias (Gast)


Lesenswert?

probier mal:

point0 = !point0;

(~ geht mit Bitvariablen nicht bei jeden Compiler)

von hilfe (Gast)


Lesenswert?

tach
- also deini init funktion schein zu stimmen

probier einmal mit einer temporären variable welche du toggelst und dann 
ausgibts....

gruss

von MikroMakro (Gast)


Lesenswert?

Hi Matthias, gleiches Verhalten.
compiliere ich ein pointx wird getoggelt.
compiliere ich beide geht nix.

 Grüße Mi.

von Peter D. (peda)


Lesenswert?

MikroMakro schrieb:
> Hallo Spezialisten.
> Ich bin daran einer scheinbar einfachen Aufgabe zu scheitern.
> (Code im Anhang)

Diese Code toggled nichts, sondern setzt P1 auf den konstanten Wert 
0x03.

Du mußt schon den Code zeigen, der fehlerhaft sein soll!


Peter

von MikroMakro (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Peter.

> Diese Code toggled nichts, sondern setzt P1 auf den konstanten Wert
0x03.

damit meinst du P1=~0xfc; das gehört nicht zum Code (sorry)

im Anhang nochmals die Ausgangssituation.

Mi.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ich würde mir da einfach mal das Assemblerlisting, das der Compiler 
ausspuckt, ansehen...

von G. O. (aminox86)


Lesenswert?

zum Toggeln XOR verwenden!

001 XOR 001 = 000
000 XOR 001 = 001

usw.

von Peter D. (peda)


Lesenswert?

Ich hab den Kommentar rausgenommen, der Code sieht vollkommen o.k. aus:
1
             ; FUNCTION timer0_isr (BEGIN)
2
0000 C0E0          PUSH    ACC
3
                                           ; SOURCE LINE # 21
4
                                           ; SOURCE LINE # 26
5
0002 E500    R     MOV     A,count+01H
6
0004 640A          XRL     A,#0AH
7
0006 4500    R     ORL     A,count
8
0008 7008          JNZ     ?C0003
9
                                           ; SOURCE LINE # 27
10
000A B292          CPL     point0
11
                                           ; SOURCE LINE # 28
12
000C B293          CPL     point1
13
                                           ; SOURCE LINE # 29
14
000E F500    R     MOV     count,A
15
0010 F500    R     MOV     count+01H,A
16
                                           ; SOURCE LINE # 30
17
0012         ?C0003:
18
                                           ; SOURCE LINE # 32
19
0012 0500    R     INC     count+01H
20
0014 E500    R     MOV     A,count+01H
21
0016 7002          JNZ     ?C0008
22
0018 0500    R     INC     count
23
001A         ?C0008:
24
                                           ; SOURCE LINE # 33
25
001A D0E0          POP     ACC
26
001C 32            RETI
27
             ; FUNCTION timer0_isr (END)

Peter

von JJJ (Gast)


Lesenswert?

P1 ^= 0xfc;

von MikroMakro (Gast)


Angehängte Dateien:

Lesenswert?

Danke an alle.

Das Toggeln der PortPins funktioniert.
Aber nicht auf dem System was ich verwendete.
Auf einem kleinen AT89c2051 funtioniert alles tadellos.

Ich habe mal den Code wie er auf dem ersten System, mal läuft mal nicht 
läuft angehangen und Kommentare beigelegt.
Irgendwie bekommt das System Probleme, wenn die "if" - Anweisung aktiv 
ist.
Und ich auch die Timerregister in der ISR nicht neu lade.
Lade ich die Register nicht neu, toggelt evtl mal ein Port oder beide im 
Gegentakt. Wenn überhaupt.

Kann sich das jemand erklären?
Mein nächster Schritt wird ein neuer Controller mit Bootloader sein.
Oder kann es am Bootlader selber leigen?

Grüße Mi.

von Matthias (Gast)


Lesenswert?

Benutzt Du Flip für den AT89C51ED2?

von MikroMakro (Gast)


Lesenswert?

Für den AT89C51ED2 hatte ich µVision genommen.

von MikroMakro (Gast)


Lesenswert?

Ich habe den AT89C51ED2 jetzt mit FLIP programmiert.
Jetzt funktioniert das Programm.

Liegt das nun an µVision?
Ist eine Einstellung falsch?

Ich nutze gleiche Programmerkabel, gleiches Board und Controller.

Hat jemand eine Idee?

Grüße Mikro

von Matthias (Gast)


Lesenswert?

Es gibt 2 Varianten das Programm zu starten. Einmal läuft der interne 
Bootloader noch im Hintergrund mit (inkl. seiner Interrupts usw.) zum 
anderen praktisch mit einem Kaltstart. Bei Flip kannst Du das unten 
rechts mit den Haken bei Reset (Start Application) einstellen.

von MikroMakro (Gast)


Lesenswert?

Guten Morgen.

Nachdem nun mit Flip das Programm lief, habe ich den Chip wieder erased.
PSEN habe ich wieder umgejumpert
Daraufhin habe ich µVision neu installiert.
Jetzt findet µVision das Target nicht mehr.

Ich habe in Flip keine Bits geändert.
Den Bootloader habe ich sicher auch nicht gelöscht. Oder?

Was muss ich tun, damit µVision das Target wieder findet?

Grüße Mi.

von Matthias (Gast)


Lesenswert?

Den Bootloader kann man meines Wissens nicht löschen. Man kann nur das 
BLJB-Bit löschen, mit PSEN=L beim Reset müsste er trotzdem noch starten.

Mit µVision kenne ich mich nicht so genau aus. Ich nehme grundsätzlich 
FLIP. Das geht auch in einem Batch-Prozess (BATCHISP), welchen Du bei 
Keil im Anschluß an die Code-Generierung automatisch ausführen kannst.

BSP.:
batchisp -cmdfile "at89C51ED2.cmd"

Inhalt der "at89c51ED2.cmd"
-device AT89C51ED2
-hardware RS232
-port COM1
-baudrate 57600
-operation
 memory FLASH
 erase f
 loadbuffer "Pfad zu Deiner HEX\dein_hex.hex"
 program
 verify
 start reset 0
 wait 5

von MikroMakro (Gast)


Lesenswert?

Ja, du hast recht, ich habe es gerade gelesen, den Bootloader kann man 
nicht löschen.
Den ROM (2k bootloader) kann man weder löschen noch beschreiben.

Ich habe - BATCHISP - über µVision genutzt.
Das Programm lies sich in den Controller flashen und das Programm läuft 
auch.
Kann ich den controller auch damit wieder stoppen?
Oder nur mit Hardware-Reset

Ist es so, wenn ich das Häkchen bei BLJB löschen, dass diese aktion 
sofort ausgelöst wird? Oder muss ich noch was starten?

Nur warum geht das mit µVision nicht mehr?

von MikroMakro (Gast)


Lesenswert?

Ok. ich habe die ... .cmd mit deinen Angabe vervollständigt.
Programm startet.

Gibt es nun auch die Möglichkeit ohne HW-Reset ein neuen Code zu 
flashen?

von Matthias (Gast)


Lesenswert?

>Gibt es nun auch die Möglichkeit ohne HW-Reset ein neuen Code zu
>flashen?

Ja gibt es. Dazu muss Dein Board oder Programmieradapter AUTOISP 
unterstützen, wobei der PSEN und RESET-PIN von FLIP über RTS/DTR der 
RS232 gesteuert wird.

Bei FLIP musst Du AUTOISP aktivieren.

von MikroMakro (Gast)


Lesenswert?

Aber dennoch muss es auch mit µVision gehen. Ging ja bisher auch.
Habe ich mit der ersten Benutzung von Flip was geändert?
Im Anhang sind meine Einstellung in Flip sichtbar.
Ist das BLJB-Bit = 0 wird ja der Bootloader nach Reset gestartet.
Ist X2 gesetzt -> 12 clocks per instruction (8051 üblich)

Oder stimmt da noch was nicht?

Grüße

von MikroMakro (Gast)


Angehängte Dateien:

Lesenswert?

Sorry der Anhang

von Matthias (Gast)


Lesenswert?

X2 angehakt: 6-Cycle Mode (offen: 12-Cycle Mode)

BLJB legt fest, ob beim nächsten Reset der Bootloader oder das 
User-Programm gestartet werden soll.

Reset unten bei Start Application sollte immer angehakt werden.

Zu µVision kann ich Dir nicht helfen.

von MikroMakro (Gast)


Lesenswert?

Mal sehen wie ich über µVision wieder in Gang bekomme.

Dennoch vielen Dank Matthias.

Mi.

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.