www.mikrocontroller.net

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


Autor: MikroMakro (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, dass

P1=~0xfc;

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier mal:

point0 = !point0;

(~ geht mit Bitvariablen nicht bei jeden Compiler)

Autor: hilfe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tach
- also deini init funktion schein zu stimmen

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

gruss

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Matthias, gleiches Verhalten.
compiliere ich ein pointx wird getoggelt.
compiliere ich beide geht nix.

 Grüße Mi.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MikroMakro (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: G. O. (aminox86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum Toggeln XOR verwenden!

001 XOR 001 = 000
000 XOR 001 = 001

usw.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab den Kommentar rausgenommen, der Code sieht vollkommen o.k. aus:

             ; FUNCTION timer0_isr (BEGIN)
0000 C0E0          PUSH    ACC
                                           ; SOURCE LINE # 21
                                           ; SOURCE LINE # 26
0002 E500    R     MOV     A,count+01H
0004 640A          XRL     A,#0AH
0006 4500    R     ORL     A,count
0008 7008          JNZ     ?C0003
                                           ; SOURCE LINE # 27
000A B292          CPL     point0
                                           ; SOURCE LINE # 28
000C B293          CPL     point1
                                           ; SOURCE LINE # 29
000E F500    R     MOV     count,A
0010 F500    R     MOV     count+01H,A
                                           ; SOURCE LINE # 30
0012         ?C0003:
                                           ; SOURCE LINE # 32
0012 0500    R     INC     count+01H
0014 E500    R     MOV     A,count+01H
0016 7002          JNZ     ?C0008
0018 0500    R     INC     count
001A         ?C0008:
                                           ; SOURCE LINE # 33
001A D0E0          POP     ACC
001C 32            RETI
             ; FUNCTION timer0_isr (END)

Peter

Autor: JJJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P1 ^= 0xfc;

Autor: MikroMakro (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutzt Du Flip für den AT89C51ED2?

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für den AT89C51ED2 hatte ich µVision genommen.

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: MikroMakro (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry der Anhang

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MikroMakro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal sehen wie ich über µVision wieder in Gang bekomme.

Dennoch vielen Dank Matthias.

Mi.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.