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?
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)
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.
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.
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
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 eineLED 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.
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 :-)
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
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.
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?
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".
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:> 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
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
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?
>> 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.
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.
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?
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.