Forum: Mikrocontroller und Digitale Elektronik ATMEGA88 PORTC Ausgänge brechen ein


von Stefan S. (buffalochill)


Lesenswert?

Hi Atmelexperten,

Ich hoffe ihr könnt mir helfen denn ich bin seit ein paar Tagen am 
verzweifeln.
Ich habe einen RGB-Fader mit dem ATMEGA88 aufgebaut mit 
18-Fading-Kanälen.
An den Ausgängen hängen ULN-Darlington-Transistor-Arrays.
Mein Problem ist, dass drei Ausgänge (PC3,PC4,PC5), unter einer Last von 
2mA (Basisstrom aus PortC in Transistor) von 5V auf 1,5V fallen.
Die Flanke sieht am Oszi irgendwie auch aus, als wäre dort eine 
Kapazität die sich aufladen würde.

Ich kann ausschließen, dass sich ein Hardwarefehler eingeschlichen hat 
oder dass der AVR oder das Transistorarray kaputt wären. Auch einen 
Softwarefehler kann ich ausschließen, habe nämlich ein Testprogramm 
geschrieben in dem ich einfach nur die betreffenden Ausgänge auf 
High-Low schalte.

Vielleicht hab ich irgendwas im Datenblatt übersehen ? normalerweise 
müssten die Ausgänge des PortC doch als Ausgänge nutzbar sein ?

von Thomas E. (thomase)


Lesenswert?

Stefan Schmidt schrieb:
> Ich kann ausschließen, dass sich ein Hardwarefehler eingeschlichen hat
> oder dass der AVR oder das Transistorarray kaputt wären. Auch einen
> Softwarefehler kann ich ausschließen,
Dann müsste es ja laufen.
Wenn etwas nicht funktioniert, kann man gar nichts ausschliessen.

AVcc angeschlossen?
Ports auf Ausgang geschaltet?
DDRC |= (1 << 3) | (1 << 4) | (1 << 5);
und irgendwann später wird dann nochmal einer nachnominiert:
DDRC = (1 << 0);
Lötfehler?
Daß der Controller oder der Treiber kaputt sind, sind die 
unwahrscheinlicheren Möglichkeiten.

mfg.

von Martin K. (maart)


Lesenswert?

Hört sich so an, als wären die Pins nur als Eingang konfiguriert und du 
schaltest nur die internen Pullups ein und aus.

von gurke (Gast)


Lesenswert?

Martin Kreiner schrieb:
> Hört sich so an, als wären die Pins nur als Eingang konfiguriert und du
> schaltest nur die internen Pullups ein und aus.

Wenn das nicht, dann BITTE Schaltplan und Testprogramm posten.

von Stefan S. (buffalochill)


Lesenswert?

Habs gefunden !

Ich hatte Anfang des Programms und auch des Testprogramms noch in die 
OCR0A und OCR0B  den Wert null reingeschrieben. Ich weiss selbst nicht 
mehr warum ich das gemacht hatte, aber ich hätte nicht gedacht, dass das 
solch einen Effekt hat. Nachdem ich die Zeilen aus Verzweiflung 
auskommentiert hatte, gingen plötzlich die Ausgänge PC0-PC3 ganz normal 
o_0

von spess53 (Gast)


Lesenswert?

Hi

>Ich hatte Anfang des Programms und auch des Testprogramms noch in die
>OCR0A und OCR0B  den Wert null reingeschrieben. Ich weiss selbst nicht
>mehr warum ich das gemacht hatte, aber ich hätte nicht gedacht, dass das
>solch einen Effekt hat. Nachdem ich die Zeilen aus Verzweiflung
>auskommentiert hatte, gingen plötzlich die Ausgänge PC0-PC3 ganz normal

Willst du uns veralbern? Die PINs haben absolut nichts mit OCR0A und 
OCR0B zu tun.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

> Nachdem ich die Zeilen aus Verzweiflung auskommentiert hatte,
> gingen plötzlich die Ausgänge PC0-PC3 ganz normal

Mit anderen Worten: Der Fehler ist immer noch in deinem Programm 
drinnen. Du hast ihn nur gut genug versteckt, dass du ihn nicht 
bemerkst.

Soviel zu:
... einen Softwarefehler kann ich ausschließen ...

von Stefan S. (buffalochill)


Lesenswert?

Fragt mich nicht was da los ist. Wie gesagt, nachdem ich die Zeilen 
auskommentiert habe gings und dann ging auch meine RGB-Fading-Routine.
Ursprünglich wollte ich mit dem Programm den Timer0 ausprobieren und 
habs dann so zurecht gelegt dass ich den PortC testen konnte.
Hier der Code vom Testprogramm:

.include "m88def.inc"

.def temp = r21
;====================================================

.org 0x0000
        rjmp    main                  ; Reset Handler
.org 0x020
        rjmp    timer0_overflow       ; Timer Overflow Handler

main:

        ldi     temp, 0b11111111    ; Port B auf Ausgang
        out     DDRB, temp

        ldi     temp, 0b00111000    ; Port C (3,4,5) auf Ausgang
        out     DDRC, temp

        ldi     temp, 0b11111111    ; Port D auf Ausgang
        out     DDRD, temp

        ldi     temp, 0b00000001    ; CS01 setzen: Teiler 1
        out     TCCR0B, temp

;  ldi    temp, 0          ; Output Compare Register  OCR0B
;  sts    OCR0B, temp

;  ldi    temp, 0          ; Output Compare Register  OCR0B
;  sts    OCR0A, temp

       ldi     temp, 1<<TOIE0      ; TOIE0: Interrupt bei Timer Overflow
       sts     TIMSK0, temp

;  sei                 ; Set Interrupt Enable

bla:
ldi     temp, 0b00111000
out     PORTC, temp
rjmp bla


timer0_overflow:
;ldi     temp, 0b11111111
;out     PORTB, temp
;ldi     temp, 0b11111111
;out     PORTD, temp
ldi     temp, 0b00111000
out     PORTC, temp
nop
nop
nop
ldi     temp, 0b00000000    ; Port D auf Ausgang
out     PORTB, temp
ldi     temp, 0b00000000    ; Port D auf Ausgang
out     PORTD, temp
ldi     temp, 0b00000000    ; Port D auf Ausgang
out     PORTC, temp
reti

von troll (Gast)


Lesenswert?

Wird der Stackpointer beim 88 automatisch initialisiert?

von spess53 (Gast)


Lesenswert?

Hi

>Wird der Stackpointer beim 88 automatisch initialisiert?

Ja.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Ist ausserdem erst mal egal.
Der sei ist auskommentiert.

OK, zumindest in diesem Testprogramm seh ich keinen Fehler.

von Stefan S. (buffalochill)


Lesenswert?

Irgendwie ist das total schräg. Vor allem, wenn man nach Fehlern suchen 
muss, wo man normalerweise keine erwarten würde o_O

von Christian Erker (Gast)


Lesenswert?

Auch wenn es schonmal auftauchte im Thread, aber leicht zu übersehen 
ist:

AVCC korrekt angeschlossen? Da hängt auch der Digitalteil von PortC 
dran!

Gruß,
Christian

von Stefan E. (sternst)


Lesenswert?

Das Problem sind die 'sts'. Die Register OCR0A und OCR0B liegen im 
in/out-Bereich. Die 'sts' schreiben also in den Memory-Mapped-Bereich an 
die IO-Adressen der beiden Register. Und was liegt dort? PORTC und DDRC.

von Stefan S. (buffalochill)


Lesenswert?

ah ok, das mit dem sts/lds bzw. in/out fällt mir generell immer schwer 
zu unterscheiden

von Karl H. (kbuchegg)


Lesenswert?

> Die Register OCR0A und OCR0B liegen im in/out-Bereich. Die 'sts'

Och, Menno. Und ich hab extra noch nachgesehen, ob die sts stimmen. Das 
man da ja dann anders addressieren muss, hab ich übersehen.

> ah ok, das mit dem sts/lds bzw. in/out fällt mir generell immer schwer
> zu unterscheiden

Datenblatt
http://www.atmel.com/Images/doc2545.pdf

Seite 344 und folgende.
Alle Registeradresse größer als 0x3F sind nur per sts zu erreichen. Dort 
steht dann auch nur 1 Zahl und nicht 2 bei der Adressangabe.


... und genau das ist einer der Gründe, warum ich C bevorzuge. Um so 
einen Kleinkram will ich mich nicht kümmern müssen. Das macht der 
Compiler zuverlässiger.

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.