Hallo Leute, ich bin grad auf einen sehr eigenartigen Fehler gestoßen. Dieses kleine Programm hier soll nichts Anderes tun, als PD5 und PD6 zuschalten, wenn PC0 und PC1 auf Low stehen. Zur Initialisierung dieses Programmabschnitts wird eigentlich nur DDRC und DDRD benötigt. Wenn ich nun aber, wie hier im Beispiel DDRA mit initialisiere und für die beiden "XX" 1 eintrage, werden plötztlich PD5 und PD6 gesetzt. Die IF-Anweisungen werden völlig ignoriert. Wie kann ich mir das erklären? Hatte sowas noch nie. Wenn ich nun aber "XX" mit 0 initialisiere, funktioniert alles bestens. Wie kann das sein? DDRA wird doch hier im Programm nirgends benötigt? Versteh gerade die Welt nicht mehr! Vielen Dank für Eure Hilfe schon mal. Grüße Thomas #include <avr/io.h> #include <stdint.h> #include <avr/signal.h> #include <avr/delay.h> #include <avr/interrupt.h> int main (void) { DDRA = 0b11XX0000; DDRC = 0b00000000; DDRD = 0b11110000; for(;;) { if(!(PINC &(1<<PINC0))) { PORTD = PORTD | (1 << PD5); } if(!(PINC &(1<<PINC1))) { PORTD = PORTD | (1 << PD6); } } }
Wenn ich DDRA folgendermaßen initialisiere, passiert das Gleiche: DDRA = (1 << DDA0) | (1 << DDA1) | (1 << DDA2) | (1 << DDA3) | (1 << DDA4 | (1 << DDA5) | (1 << DDA6) | (1 << DDA7));
Ahh, Dankeschön. Daran lag es! Dieses Forum ist einfach klasse! Grüße!
Ach, und hier noch so ein Problem. An den Eingängen befindet sich ein High Signal. Es sollten also keine Ausgänge geschaltet werden. Leider wird jedoch PD5 geschaltet. Wie kommt das? Im Anhang mal ein Screenshot von den Fusebits. Vielleicht liegts ja daran. Als Testboard hab ich übrigens das Pollin AVR-Board. Hier der Quallcode: #include <avr/io.h> int main (void) { DDRB = 0b00000000; DDRD = 0b01100000; for(;;) { if(!(PINB &(1<<PINB7))) { PORTD = PORTD | (1 << PD5); } if(!(PINB &(1<<PINB6))) { PORTD = PORTD | (1 << PD6); } } }
Thomas wrote: > Ach, und hier noch so ein Problem. An den Eingängen befindet sich ein > High Signal. Sicher? Was hängt an diesem Eingang? Schalter? Taster? Elektronik? Dein Programm schaltet zwar den PD5 auf High, aber es schaltet nie wieder auf 0 zurück. D.h. der kleinste High Puls schaltet den Ausgang ein und dann bleibt er dort, egal was sonst so am Eingang passiert. Wenn dort ein Taster in der üblichen Beschaltung nach Masse schaltet: Du hast keine Pullups eingeschaltet.
Dieses kleine Testprogramm, was ich hier rein gestellt habe, entstand nur in Anbindung an ein viel größeres Programm, wo ich mit diesem Fehler zu tun hatte. Wollte halt nicht das große Programm hier rein stellen. Die PullUps hab ich hardwareseitig realisiert. Sobald ich nun die Eingänge gegen Masse stelle, müssten PD5 und PD6 auf High geschaltet werden und, wie du schon sagst, nie wieder auf Low kommen. Wie gesagt, das hier ist ja nur ein kleines Testprogramm zum Hauptprogramm, wo mich dieses Problem störte. Aber noch etwas Anderes. Mir ist aufgefallen, dass sich PINB7 nicht mit 10KOhm auf High setzen lässt. Das war auch der Grund, warum PD5 dauerhaft leuchtete. Wenn ich nun Probeweise statt des 10KOhm Pullups einen 1KOhm Widerstand nutze, klappt es plötzlich. Wie kann das sein? 1KOhm ist doch schon fast zu wenig? Grüße Thomas.
Ach so, an dem Eingang hängt ein normaler Taster, der gegen GND schaltet. Zusätzlich befindet sich noch ein PullUp Widerstand von jeweils 10K und 1K an den Eingängen.
Thomas wrote: > Dieses kleine Testprogramm, was ich hier rein gestellt habe, entstand > nur in Anbindung an ein viel größeres Programm, wo ich mit diesem Fehler > zu tun hatte. Wollte halt nicht das große Programm hier rein stellen. Ich bitte auch um Verständnis, dass ich mich nur nach dem richten kann, was ich hier sehe. Und so suche ich dann eben das gepostete Programm nach möglichen Fehlern bzw. den üblichen Problemen ab. > Aber noch etwas Anderes. Mir ist aufgefallen, dass sich PINB7 nicht mit > 10KOhm auf High setzen lässt. Das war auch der Grund, warum PD5 > dauerhaft leuchtete. Wenn ich nun Probeweise statt des 10KOhm Pullups > einen 1KOhm Widerstand nutze, klappt es plötzlich. > > Wie kann das sein? 1KOhm ist doch schon fast zu wenig? Interessant. Keinen blassen Schimmer. Allerdings benutzt ich an meinem Mega16 bei solchen Sachen auch immer den internen Pullup.
Moment: PB7 ist doch SCK vom ISP. Ist der ISP Programmer noch an die Schaltung angeschlossen?
Kein Problem. Wollte ja auch nur begründen, warum ich nur diesen Programmschnipsel gepostet habe. Das Ganze wird über das Pollin AVR-Board programmiert. Das ist auch noch angeschlossen. Ich glaub, ich erahne, worauf du hinaus willst. Das würde auch erklären, warum sich der µC nicht programmieren lässt, wenn der 1K-Pullup angeschlossen ist.
> Ich glaub, ich erahne, worauf du hinaus willst. Das würde > auch erklären, warum sich der µC nicht programmieren lässt, wenn der > 1K-Pullup angeschlossen ist. Ich denke mal: Bingo!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.