Hallo Community, bin eben bei dem Tutorial im I/O Kapitel und wollte nun die Taster abfragen. Wenn ich den ersten Taster drücke, leuchtet die erste und letzte LED. bei dem zweiten passt es, bei dem dritten leuchten die dritte und vierte Led und bei dem vierten Taster leuchtet die 5 Led. was läuft da schief?
Amtel Studio 7, und Schaltplan aus dem Tutorial http://www.mikrocontroller.net/wikifiles/f/f6/Mega8_Tutorial.png
Popopirat schrieb: > Amtel Studio 7, Nein. Gemeint ist: welches Programm hast du auf den µC gebrannt? (Und bitte keinen Verweis ins Tutorial. Poste es einfach hier hinein. So wie du es in deiner Entwicklungsumgebung hast)
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 0b11111111 |
4 | out DDRB, r16 ; Alle Pins am Port B durch Ausgabe von 0xFF ins |
5 | ; Richtungsregister DDRB als Ausgang konfigurieren |
6 | ldi r16, 0b00000000 |
7 | out DDRD, r16 ; Alle Pins am Port D durch Ausgabe von 0x00 ins |
8 | ; Richtungsregister DDRD als Eingang konfigurieren |
9 | loop: |
10 | in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen |
11 | out PORTB, r16 ; Inhalt von r16 an Port B ausgeben |
12 | rjmp loop ; Sprung zu "loop:" -> Endlosschleife |
habs genau so rauskopiert
:
Bearbeitet durch User
Eventuell hast Du Dich aber nur darin geirrt, wie die Kontaktleisten in der Lochplatte verlaufen. Das könnte sich aber beim Zeichnen des Schaltplans schon von selbst herausstellen. Ganz besonders fallen mir da die fünfer-Lochreihen auf, in denen die 180-Ohm-Widerstände stecken.
Kann es sein, das der Anschluss von Ground an Pin 22 fehlt? Mit Software ist der Code gemeint, der auf dem AVR programmiert ist.
Klaus schrieb: > Mit Software ist der Code gemeint, der auf dem AVR programmiert ist. Ops. Da war Karl Heinz (wieder mal) schneller.
die von oben nach unten laufende 5-er sind immer durchverbunden. getrennt ist es nur in der mitte wo der uC steckt.
Hm. Das ist mir schon klar. Ein ganz normales Breadboard eben. Ich mag mich ja auch irren, aber ich würde in der Pin-Reihe 16 erwarten eine Verbindung nach Masse zu sehen. Übersehe ich das was oder irre ich mich sonst irgendwie?
Du hast 4 Taster und 6 LED. D.h. 2 von deinen 6 LED können nicht per Taster geschaltet werden. Die entsprechenden Eingänge am Port B sind aber alle freigeschaltet. Jetzt ist es aber so, dass ein Eingang an dem nichts hängt, nicht automatisch eine 0 liefert. D.h. er würde es schon, nur gibt es in deiner UMgebung jede Menge elektromagnetischer Felder. Ein offener Eingang (also einer an dem nichts hängt), wirkt aber wie eine Antenne. Die saugt sich alles rein, was sie so finden kann: das Streufeld vom Staubsauger nebenann. Das STreufeld vom Fernseher. Dein Laptop hat vielleicht ein Schaltnetzteil, welches etwas abstrahlt. In der Wand sind 230V Leitungen verlegt, durch die deine Beleuchtung gespeist wird, etc. etc. All diese Felder führen dazu, dass man nicht davon ausgehen kann, dass die entsprechenden leer gelassenen Eingänge tatsächlich eine 0 liefern. Genau deswegen hast du ja auch die Pullup Widerstände an den Tastern verbaut, damit bei nicht gedrückte Taster genau diese Eingänge eben nicht in der Luft hängen (= frei sind). Wenn du am Port B ganz einfach die im Mega8 eingebauten Pullup Widerstände aktivierst, dann ist der Spuk insofern vorbei, weil diese Eingänge dann mit Sicherheit immer eine 1 liefern werden. Den Rest, das die Nummerierung jetzt scheinbar durcheinander ist, das würde ich mal auf einen Fehler in deiner Nummerierung schieben. Da müsste man jetzt genau verfolgen, welches Kabel am Steckbrett wo hin führt.
Hüstel. Ja. Das ist natürlich auch wichtig. So etwas aber auch!
jtzt habe ich mal alle pullup widerstände aktiviert, jetzt schalte ich ein und es leuchten led 1-4, die 5 ist aus, und die 6 leuchtet wieder. sehr komisch....
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 0b11111111 |
4 | out DDRB, r16 ; Alle Pins am Port B durch Ausgabe von 0xFF ins |
5 | ; Richtungsregister DDRB als Ausgang konfigurieren |
6 | ldi r16, 0b00000000 |
7 | out DDRD, r16 ; Alle Pins am Port D durch Ausgabe von 0x00 ins |
8 | ; Richtungsregister DDRD als Eingang konfigurieren |
9 | |
10 | ldi r16, 0b11111111 ; An allen Pins vom Port D die Pullup-Widerstände |
11 | out PORTD, r16 ; aktivieren. Dies geht deshalb durch eine Ausgabe |
12 | ; nach PORTD, da ja der Port auf Eingang gestellt ist. |
13 | loop: |
14 | in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen |
15 | out PORTB, r16 ; Inhalt von r16 an Port B ausgeben |
16 | rjmp loop |
PopoPirat schrieb: > jtzt habe ich mal alle pullup widerstände aktiviert, jetzt schalte ich > ein und es leuchten led 1-4, die 5 ist aus, und die 6 leuchtet wieder. > sehr komisch.... Vielleicht doch mal ein Schaltplan? Ich habe echt keinen Bock, von dem Breed Board die Schaltung auf zu nehmen.
theoretisch zeichne ich ja nur dann den plan vom tutorial nach. habs öfters nochmal kontrolliert und alle drähte gehen auch da hin wo se hin sollen ich mal aber mal die steckboard belegung nach
Mach mal folgendes. Nimm alle Taster und alle LED vom Board. Und dann schliesst du einen Taster und eine LED an. Zum beispiel die jeweils am Bit 0. Zusätzlich schliesst du noch die LED am Bit 4 und am Bit 5 an. Taster drücken, darf auch nur die LED an Bit 0 angehen. Die restlichen beiden müssen aus bleiben. Dann kommt eine weitere LED an Bit 1 dazu (kurzer Test, ob sie auch nicht durch den einen Taster betätigt wird) und dann der zugehörige Taster ebenfalls am Bit 1. Wieder: testen, ob noch alles in Ordnung ist. Und so nimmst du jeweils eine weitere LED dazu, jeweils testen, ob sie nicht durch die bereits vorhandenen Taster angesprochen wird, und wenn das gesichert ist, dann kommt der jeweilige Taster mit dazu.
Michael H. schrieb: > kann es sein das er hin ist der chip? Theoretisch: ja Praktisch halten die Dinger aber so viel aus, dass du da schon mit schweren Geschützen auffahren müsstest um die Porttreiber zu ruinieren. Praktisch gesehen ist es sehr viel wahrscheinlicher, dass irgendetwas anderes los ist.
also wenn ich nur eine led und ein taster anschliese dann geht die gleich an sobald spannung das ist, also auch ohne betätigung.
Michael H. schrieb: > Naja ich hoffe man kanns erkennen Da fehlt erst mal die Versorgungsspannung an Avcc sowie der GND Anschluss an dieser Seite vom µC. Pins 20 und 22
Michael H. schrieb: > also wenn ich nur eine led und ein taster anschliese dann geht die > gleich an sobald spannung das ist, also auch ohne betätigung. Hast du ein Voltmeter? Wenn ja, dann miss mal die Spannung direkt am µC an dem Pin, an dem du den Taster angeschlossen hast. (WElcher ist das?) Erst ohne den Taster zu drücken. Du solltest an dem Pin 5V messen. Dann wenn der Taster gedrückt ist. Du solltest dann 0V messen können. Wenn dem nicht so ist, dann könnte es sein, dass du den Taster um 90° verkehrt rum eingesetzt hast. Der hat dann Dauerdurchgang :-)
:
Bearbeitet durch User
also ich hatte wirklich keine verbindung von pin pin 22 zu gnd und 20 zu 5v. ich wunder mich gerade nur das diese beiden zeichnungen die pins 20,21 u. 22 anderst beschalten oder seh ich da falsch
also so sieht die schaltung aus: immernoch gleich wenn ich einschalte dann leuchtet gleich die erste led ohne das ich was drücke. hab ich den chip kaputtgemacht weil ich gnd und 5v bei pin 20 und 22 vergessen habe?
Michael H. schrieb: > hab ich den chip kaputtgemacht weil ich gnd und 5v bei pin 20 und 22 > vergessen habe? eher unwahrscheinlich. Zieh mal das weisse Kabel raus und lass so den Taster am Eingang erst mal weg. So wie du die LED verschaltet hast, müsste die dann aus sein.
Michael H. schrieb: > also ich hatte wirklich keine verbindung von pin pin 22 zu gnd und 20 zu > 5v. > > ich wunder mich gerade nur das diese beiden zeichnungen die pins 20,21 > u. 22 anderst beschalten oder seh ich da falsch Das siehst du schon richtig. Die Spule L1 ist aber (noch) nicht notwendig. Die kommt erst dann ins Spiel, wenn du irgendwann mal den ADC in Betrieb nimmst. Ist aber auch nicht sooo schlimm, wenn du keine drinnen hast und AVcc direkt mit Vcc verbindest. Abgesehen von dieser Spule ist die restliche Beschaltung der Spannungsversorgung identisch.
Karl H. schrieb: > Zieh mal das weisse Kabel raus und lass so den Taster am Eingang erst > mal weg. Zieh das weisse Kabel an dem Ende aus dem Steckbrett, an dem der Taster sitzt. Mit dem jetzt freien Ende kannst du ja mal direkt Die Versorgungsspannung bzw. Masse antippen. Tippst du Masse an, muss die LED aufleuchten. Lässt du das ENde frei bzw. tippst du 5V an, ist die LED aus.
also wenn das ende herausgenommen wird bleibt sie an. tippe ich 5v an geht sie aus und nach kurzen wieder an aber nicht in der vollen stärke. tippe ich masse an geht sie in voller stärke an. code stimmt aber oder?
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 0b11111111 |
4 | out DDRB, r16 ; Alle Pins am Port B durch Ausgabe von 0xFF ins |
5 | ; Richtungsregister DDRB als Ausgang konfigurieren |
6 | ldi r16, 0b00000000 |
7 | out DDRD, r16 ; Alle Pins am Port D durch Ausgabe von 0x00 ins |
8 | ; Richtungsregister DDRD als Eingang konfigurieren |
9 | |
10 | ldi r16, 0b11111111 ; An allen Pins vom Port D die Pullup-Widerstände |
11 | out PORTD, r16 ; aktivieren. Dies geht deshalb durch eine Ausgabe |
12 | ; nach PORTD, da ja der Port auf Eingang gestellt ist. |
13 | loop: |
14 | in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen |
15 | out PORTB, r16 ; Inhalt von r16 an Port B ausgeben |
16 | rjmp loop |
:
Bearbeitet durch User
Michael H. schrieb: > also wenn das ende herausgenommen wird bleibt sie an. > > tippe ich 5v an geht sie aus ? Du siehst mich mit gerunzelter Stirn. Das kann eigentlich gar nicht sein. > und nach kurzen wieder an aber nicht in der > vollen stärke. ? Das klingt nach irgendetwas, das ins Schwingen kommt.
kann es am externen quarz liegen? sind die fuses nicht richtig gesetzt?
Lass uns mal was anderes probieren
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 1 |
4 | out DDRB, r16 |
5 | |
6 | loop: |
7 | ldi r16, 1 |
8 | out PORTB, r16 |
9 | rjmp loop |
Die LED darf nicht leuchten. Wohingegen:
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 1 |
4 | out DDRB, r16 |
5 | |
6 | loop: |
7 | ldi r16, 0 ; <- hier ist der Unterschied |
8 | out PORTB, r16 |
9 | rjmp loop |
Die LED muss leuchten
:
Bearbeitet durch User
Michael H. schrieb: > kann es am externen quarz liegen? sind die fuses nicht richtig gesetzt? Das weiss ich nicht. Hast du denn an den Fuses rumgespielt? (Wenn es da ein Problem gäbe, dann könntest du kein Programm mehr auf den AVR aufspielen)
@Karl Heinz Was sagt eigentlich Deine Frau dazu,daß Du Dich nachts halb2 noch mit diesen Anfängerproblemen rumschlägst :-) Kann vielleicht der Watchdog aktiv sein?
also hab beide codes mal getestet, ist so wie es sein soll. und nun? :-D
Hans schrieb: > @Karl Heinz > > Was sagt eigentlich Deine Frau dazu,daß Du Dich nachts halb2 noch mit > diesen Anfängerproblemen rumschlägst :-) Man muss Prioritäten setzen :-) > > Kann vielleicht der Watchdog aktiv sein? Das hoffe ich ja doch nicht.
Michael H. schrieb: > also hab beide codes mal getestet, ist so wie es sein soll. > > und nun? :-D Gut. Das ist schon mal was. Lass mich überlegen. Was kommt als nächstes. OK. Port D auf Input schalten und Pullup aktivieren
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 1 |
4 | out DDRB, r16 |
5 | |
6 | ldi r16, 0 |
7 | out DDRD, r16 |
8 | ldi r16, 1 |
9 | out PORTD, r16 |
10 | |
11 | loop: |
12 | ldi r16, 1 |
13 | out PORTB, r16 |
14 | rjmp loop |
Noch ist nichts passiert. Die LED darf nach wie vor nicht leuchten.
Also wenn der TO noch Zeit hat und Du K.H. irgendwann mal schlafen möchtest kann ich übernehmen... Hab zur Nachtschicht bis 5 Uhr gerade nix besseres zu tun ;-)
Michael H. schrieb: > soweit so gut Gut Dann steckst du deinen weissen Draht wieder am Pin D0 an (Pin Nummer 2, der 2te in der untere Reihe von links)
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 1 |
4 | out DDRB, r16 |
5 | |
6 | ldi r16, 0 |
7 | out DDRD, r16 |
8 | ldi r16, 1 |
9 | out PORTD, r16 |
10 | |
11 | loop: |
12 | in r16, PIND |
13 | out PORTB, r16 |
14 | rjmp loop |
den Taster lass mal aussen vor. Mit dem freien Ende vom Draht an Masse tippen. Die LED sollte zu leuchten anfangen. Draht von Masse wegnehmen. Die LED muss ausgehen. Sofort und ohne Zwischenstufe.
Hans schrieb: > Also wenn der TO noch Zeit hat und Du K.H. irgendwann mal schlafen > möchtest kann ich übernehmen... Hab zur Nachtschicht bis 5 Uhr gerade > nix besseres zu tun ;-) Danke. Ich bin echt neugierig, was da los ist. Noch hab ich noch nicht einmal eine Hypothese. Gut am Port B hängt der Quarzoszillator. Wenn der µC richtig gefused ist, dann spielt das aber keine Rolle, weil die Pins dann keine IO Pins sind. Autsch. Das könnte es sein. Noch ist nicht klar, ob der richtig gefused ist.
Michael H. schrieb: > klappt auch... spannung steigt :) Gut. Dann nimm den Taster mit dazu. Achtung: Es ist nicht egal, wie rum du den rein steckst. Von dem Taster sind jweils die beiden Pins an einer Seite miteinander verbunden. Wenn du den also um 90° verdreht einbaust, dann hast du da eine Brücke gesteckt. Das ist so, wie wenn du den Taster dauernd gedrückt hältst. (ja, ja ich weiss. Aber mir sind auch schon blöde Fehler passiert). Der weisse Draht soll über den Taster (wenn er gedrückt ist) die Verbindung nach Masse herstellen. Ist der Taster nicht gedrückt, dann hängt der Draht "in der Luft".
also tut auch, in der luft hängt er ja nicht da wir doch die internen pullups aktiviert haben oder? hier mal die fuses
Wenn das dann auch klappt (es gibt keinen Grund mehr warum es nicht so sein sollte), dann probieren wir mal etwas. Aber erst mal muss die LED auf den Tastendruck reagieren.
Michael H. schrieb: > also tut auch, in der luft hängt er ja nicht da wir doch die internen > pullups aktiviert haben oder? Völlig korrekt.
Michael H. schrieb: > hier mal die fuses Hmm. Sieht richtig aus. Damit ist meine Hypothese gestorben. OK, den test kann man ja trotzdem machen. Zieh mal die Verbindung zum Quarzoszillator raus. Wenn der µC dann immer noch die LED laut Taster richtig ansteuert, dann ist der nicht aktiv. Wenn danach allerdings nichts mehr geht, dann ist er aktiv (so wie es sein sollte)
Michael H. schrieb: > led funkt auch auf tastendruck, passt soweit Gut. Hast du mal probiert, ob der Quarzsozillator aktiv ist? Ich will eigentlich nur indirekt rausfinden, ob das Schalten des Pins PB6 bzw. PB7 irgendwelche Auswirkungen haben kann. Ist eigentlich durch die Fuses nicht möglich. Aber ich hab keine Erklärung, warum das vorher nicht funktioniert hat
also wenn quarz raus ist dann geht der nicht mehr, wie gewünscht. soll ich mal den ursprünglichen code nochmal probieren?
Michael H. schrieb: > also wenn quarz raus ist dann geht der nicht mehr, wie gewünscht. > > soll ich mal den ursprünglichen code nochmal probieren? Warte noch. Nimm den hier
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 0xFF ; <- Unterschied |
4 | out DDRB, r16 |
5 | |
6 | ldi r16, 0 |
7 | out DDRD, r16 |
8 | ldi r16, 1 |
9 | out PORTD, r16 |
10 | |
11 | loop: |
12 | in r16, PIND |
13 | out PORTB, r16 |
14 | rjmp loop |
Und danach den hier
1 | .include "m8def.inc" |
2 | |
3 | ldi r16, 0xFF ; <- Unterschied |
4 | out DDRB, r16 |
5 | |
6 | ldi r16, 0xFF ; <- naechster Unterschied |
7 | out DDRD, r16 |
8 | ldi r16, 1 |
9 | out PORTD, r16 |
10 | |
11 | loop: |
12 | in r16, PIND |
13 | out PORTB, r16 |
14 | rjmp loop |
Nö. Das war Quatsch. Die letzten beiden Codeversionen verraten nichts. Du kannst genausogut deinen Original Code (aber den mit den Pullups) draufspielen. Macht keinen Unterschied und muss funktionieren.
Karl H. schrieb: > Und danach den hier > [avrasm] > .include "m8def.inc" > > ldi r16, 0xFF ; <- Unterschied > out DDRB, r16 > > ldi r16, 0xFF ; <- naechster Unterschied > out DDRD, r16 > ldi r16, 1 > out PORTD, r16 ist das beabsichtigt das nur bei dem ersten taster der pullup aktiviert wird?
Michael H. schrieb: > Karl H. schrieb: >> Und danach den hier >>
1 | >> .include "m8def.inc" |
2 | >> |
3 | >> ldi r16, 0xFF ; <- Unterschied |
4 | >> out DDRB, r16 |
5 | >> |
6 | >> ldi r16, 0xFF ; <- naechster Unterschied |
7 | >> out DDRD, r16 |
8 | >> ldi r16, 1 |
9 | >> out PORTD, r16 |
10 | >> |
> > ist das beabsichtigt das nur bei dem ersten taster der pullup aktiviert > wird? schreib es der vorgerückten Stunde zu. Ich wollte eigentlich alle Pullups aktivieren und hab mich in der Zeile vertan.
1 | ldi r16, 0 |
2 | out DDRD, r16 |
3 | ldi r16, 0xFF ; <- da wollte ich eigentlich |
4 | out PORTD, r16 |
Aber... das bringt keine neuen Erkentnisse. Da kannst du genausogut deine Version von weiter oben benutzen.
:
Bearbeitet durch User
Karl H. schrieb: > Aber... das bringt keine neuen Erkentnisse. Da kannst du genausogut > deine Version von weiter oben benutzen. Also die hier Beitrag "Re: AVR Assembler Tut: Was mache ich falsch?"
funktioniert............ also ich blicks net warum es net vorher ging....
Michael H. schrieb: > funktioniert............ > > also ich blicks net warum es net vorher ging.... ist mir auch nicht ganz klar. Schlechter Kontakt irgendwo im Steckbrett, der sich durch die Umbauarbeiten jetzt gegeben hat? Die anderen LED bzw. Taster sind jetzt drann? (Ich würde auch hier wieder schrittweise ein Pärchen nach dem anderen anbauen. Schon alleine im Hinblick darauf, dass wir alle 'heute' nicht mehr die Frischesten sind :-)
:-) Wenigstens ist der magische Rauch im µC drinnen geblieben. Im Ernst. Ich kann dir keine wirkliche Erklärung anbieten, was da los war. Ich weiss, das ist unbefriedigend. Alibimässig könnte ich höchstens alles aufs Steckbrett schieben, aber ich kanns nicht beweisen. Auf jeden Fall: schön dass es jetzt klappt. So. Und jetzt ab in die Heia.
:
Bearbeitet durch User
Karl H. schrieb: > alles aufs Steckbrett schieben Wohin sonst? Korrosion? Wackelkontakte? Was mich noch interessieren würde ist wozu die .include Anweisung gut sein soll. Langt doch wenn im Studio-Asm Projekt der richtige Controller eingestellt ist! Ausserdem, warum zeigt die Target-Spannungsanzeige im Fuse-Bild 0 Volt?
dachte man muss sie immer einbinden... weis ich nicht, es kommt auch immer ne meldung beim programmieren. aber scheint nicht weiter zu stören
..das ist ja hier wie die Väter, die mit der Eisenbahn der Kinder spielen, wenn die bereits im Bett sind...
Popopirat schrieb: > was läuft da schief? Anfänger sollten nicht mit vielem gleichzeitig anfangen. Kauf dir ein DevBoard, oder im Zweifel einen Arduino und schmeiss den Bootloader runter und lass am Anfang den Quatsch mit dem Breadboard. Dann kannst Du HW Fehler im Prinzip ausschließen und deine Fähigkeiten im Programmieren schulen. Wenn Du das kannst, fängst Du an mit HW zu spielen. Beides zusammen geht meist in die Hose wie hier eindeutig demonstriert.
Michael H. schrieb: > weis ich nicht, es kommt auch immer ne meldung beim programmieren. aber > scheint nicht weiter zu stören Ach eine Meldung.... Die nerven nur... so Meldungen... Am besten, noch nicht einmal ignorieren. Die Meldung. Wer Meldungen liest, oder gar im Forum postet, wenn was nicht funktioniert, der ist sowieso ein Weichei. Eine Andeutung reicht. Vollkommen. (wenn alles erledigt ist)
Michael H. schrieb: > dachte man muss sie immer einbinden... Musste man auch. Im alten Avr-Studio Im neuen Atmel Studio bindet die IDE bzw. der Assembler (weiss nicht genau wer), die passende Datei anhand des bekannten Prozessors automatisch ein. Das Tutorial ist zu Zeiten vom AVR-Studio entstanden. Daher sind da überall noch die entsprechenden .include mit drinnen.
So sieht die Meldung aus wenn ich Programmieren will. Läuft aber dennoch.
Hi >So sieht die Meldung aus wenn ich Programmieren will. Läuft aber >dennoch. Und was für einen Programmer hast du? MfG Spess
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.