Forum: Mikrocontroller und Digitale Elektronik Ist er kaputt ?


von Reinhard (Gast)


Lesenswert?

Hallo,

mein µC 4433 setzt mir die Bits des Ports C nicht mehr. Port D wird 
richtig gesetzt . Kann es sein, dass der Controller defekt ist ? Ich 
weiß zwar nicht wie oft ich ihn schon geflasht habe, aber es könnten 
schon 800 bis 1000 mal gewesen sein.
Gibt es eine Fehlermeldung wenn der Speicher defekt ist ?

Hier ein paar Zeilen aus meinem Programm.

ldi r16, 0xff  ;Datenbus als Ausgang konfigurieren
out DDRD, r16
ldi r16, 0x01
out Portd, r16  ;Low addr Byte schicken


ldi r16, 0xff  Hier der Bösewicht !!!
out DDRC, r16
ldi r16,0x13                                        out Portc, r16
nop

Gruß
Reinhard

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hast du AGND und AVCC angeschlossen (siehe Tutorial)?

von Reinhard (Gast)


Lesenswert?

Hat geklappt.

Jetzt noch ein Frägelchen vorm schlafen gehen.

Abfrag1:

ldi r16, 0x00
out DDRD, r16
sbis Portd, 0x03

rjmp Abfrag1

Wenn die ersten beiden Bits Portd gesetzt sind wird die Schleife 
verlassen .
Sehe ich das richtig ?

In meinem Prog wird die Schleife nicht verlassen obwohl die ersten 
beinen High sind.




Danke

Reinhard

von Schmittchen (Gast)


Lesenswert?

> Wenn die ersten beiden Bits Portd gesetzt sind wird die Schleife verlassen. Sehe 
ich das richtig ?
Ja, aber so meinst du das nicht. ;-)

Du bist, nachdem du Anfängerfehler Nr.3 (AVCC/AGND/AREF nicht 
angeschlossen...) umschifft hast, sofort auf Anfängerfehler Nr.2 
gestoßen: Einlesen der anliegenden Pegel an den IC-Beinchen immer durch 
Auslesen des _PIND_-Registers, nicht PORTD!!

Außerdem:
InstructionSet rauskram - SBIS A,b ;wobei b zwischen 0 und 7 liegen 
muß. b gibt die Nummer des Pins an, der abgefragt werden soll.

Das heisst also konkret:
Wenn du die Pegel an PD0 und PD1 abfragen willst ((und nicht nur 
wissen willst, wie _PORTD0/1_ gerade sitzt)), mußt du die 
Abfragebedingung anpassen. Das geht dann nicht mehr mit einem einfachen 
(wohl aber mit einem zweifachen) sbis:
sbis PIND, 0
rjmp Abfrag1
sbis PIND, 1
rjmp Abfrag1

Oder du maskierst die restlichen, uninteressanten Bits aus und prüfst 
auf "0x03":
in   pind, r16    // Pegel an PinD einlesen
andi r16, 0x03    // alle Bits zu Null setzten, außer Bit0 und 1
subi r16, 0x03    // 0x03 abziehen
brne Abfrag1      // wenn jetzt nicht 0 rauskommt, dann liegt an PD0/1 
auch kein high an

(Die 2.Variante ist etwas länger, aber ab einer gewissen Anzahl von 
abzufragenden Eingängen ist diese dann kürzer - Geschmackssache.)

Schmittchen.

von Reinhard (Gast)


Lesenswert?

Hallo,

ich hänge immer noch am gleichen Problem.
Beide Bits sind High.
Die Schleife wird jedoch nicht verlassen.

Abfrag1:

         ldi r16, 0x00
   sbis Pind, 0x01
   rjmp Abfrag1
   sbis Pind, 0x02
   rjmp Abfrag1




Gruß
Reinhard

von Reinhard (Gast)


Lesenswert?

Noch mal korrigiert.

Abfrag1:

         ldi r16, 0x00
   out DDRD, r16
   sbis Pind, 0x01
   rjmp Abfrag1
   sbis Pind, 0x02
   rjmp Abfrag1

von Schmittchen (Gast)


Lesenswert?

> Beide Bits sind High.
Welche beiden?
Dein Code fragt PD1 (sbis pind,_1_) und PD2 (sbis pind,_2_) ab. Ich 
denke du willst auf PD0 und PD1 abfragen. Also Code entsprechend 
anpassen.

Schmittchen.

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.