hallo, hier schreibt einer so aufgeregt wie kurz vor dem jahreswechsel! folgendes funktioniert nicht, wie ich es mir vorstelle: .include "tn2313def.inc" ;Definitionsdatei einbinden ldi r16, 0b00011000 ; 3, 4 als ausgang, rest eingang. out DDRB, r16 ;(portart bestimmen) ldi r16, 0b11111111 ; 3, 4 einschalten, rest pull-ups aktivieren out PORTB, r16 loop: sbic PINB, 6 ;"skip if bit cleared", nächsten Befehl überspringen, ;wenn Bit 0 im IO-Register PIND =0 (Taste 0 gedrückt) rjmp loop ;Sprung zu "loop:" -> Endlosschleife cbi PORTB, 4 ;Bit 3 im IO-Register PORTB auf 0 setzen -> grüne LED aus ende: rjmp ende ;Endlosschleife was passiert? die led geht sofort aus (bzw. 'gar nicht erst an', avrisp abziehen oder spannung aus/ein), ohne, daß ich den besagten knopf gedrückt hätte. meine beiden taster sind an 5 und 6, der pull-up ist aktiv (zumindest messe ich etwas um 5V) und die pins werden durch die taster jeweils erfolgreich gegen masse geschaltet. wenn es also (?) kein hardware-problem ist, wo mache ich den denkfehler im programm? schonmal danke, leif
@leif schön daß du da drüber gesprochen hast und wir dir helfen konnten g
[fortsetzung von http://www.mikrocontroller.net/forum/read-1-234032.html#new] Hi Bolle, vielen Dank für die Erklärung! Als Gegenleistung werde ich mich ab jetzt bemühen, hin und wieder mal die Shift-Taste einzusetzen. Hier erstmal der aktuelle Code (wie oben, nur nach Deinen Anweisungen initialisiert): .include "tn2313def.inc" ;Definitionsdatei einbinden ldi r16, 0b11111111 ;wert ins Arbeitsregister r16 laden out PORTB, r16 ;Inhalt von r16 ins IO-Register DDRB ausgeben (pull-ups einschalten, bzw wert ausgeben) ldi r16, 0b00011000 ;wert in r16 laden out DDRB, r16 ;r16 ins IO-Register PORTB ausgeben (portart bestimmen) loop: sbic PINB, 6 ;"skip if bit cleared", nächsten Befehl überspringen, ;wenn Bit 0 im IO-Register PIND =0 (Taste 0 gedrückt) rjmp loop ;Sprung zu "loop:" -> Endlosschleife cbi PORTB, 4 ;Bit 3 im IO-Register PORTB auf 0 setzen -> rote LED aus ende: rjmp ende ;Endlosschleife Und diesmal wir die rote LED ausgeschaltet. "leif steckt nochmal eben den AVRISP drauf, um zu checken, ob dann wirklich beide LEDs leuchten, wie sein Gedächtnis aus unbekanntem Grund einwendet. leif zieht den AVRISP ab, und, und SIE BLEIBEN AN! bis leif den knopf drückt." freu Aber ich wollte noch was fragen, und .. zwar hat sich das gerade auch geklärt. Wenn beim Einschalten alls Inputs sind, macht es auch nichts, wenn ich alles (auch meine geplanten Ausgänge) logisch 1 setze. Vielen Dank!
Ihr seid wirklich hilfsbereit! Es ist echt erstaunlich, wieviel Freude eine kleine LED macht, wenn man sie per Knopfdruck ausschalten kann :-)
Hi, vielen Dank an Bolle. Hat mir viel Schreibarbeit abgenommen und ich könnts nicht besser erklären! Vielleicht noch mein Beispiel warum mir das ins Auge gestochen ist. Ich hab, als ich mit den AVRs angefangen hab auch einfach das Tutorial abgetippt. Damals hab ich eine Phasenanschnittsteuerung für einen Motor gebaut und mich immer gewundert warum der Motor beim Einschalten kurz zuckt. Da ist genau das aufgetreten was Bolle erklärt hat. Der Ausgang an welchem der Triac hing hatte kurz den falschen Zustand und hat den Triac gezündet. Ich wollte eigentlich keine große Diskusion losbrechen. Ist mir nur so aufgefallen... Gruß, Michael
Zwei Sachen könnte man noch ergänzen: 1. Es wäre sogar möglich, daß der Übergangszustand länger als nur einen Maschinentakt anhält, nämlich dann, wenn just nach der Abarbeitung der ersten Zeile und vor Abarbeitung der zweiten irgendein vermaledeiter Interrupt auftritt. Um dies zu unterbinden, müßte man die Angelegenheit strengstensgenommen also sogar als critical section behandeln, und die beiden Zeilen in "cli - sei" einschließen. 2. Für den Fall, daß der (wie gesagt i. a. unkritische) Übergangszustand "Input mit aktiviertem Pullup" auf die angeschlossene Peripherie doch unerwünschte Auswirkungen hat, gibt es z. B. beim ATMega8 ein spezielles Konfigurationsbit, über das alle Pullups an allen Ports zwangsdeaktiviert werden können ("PUD"-Bit im "SFIOR"-I/O-Register). Näheres dazu siehe Data Sheet zum ATMega8, Seite 51.
Hallo... ich hoffe ich bin hier richtig, da ich ein änliches Problem habe. Ich verwende das STK500 und für den Anfang habe ich ein kleines Programm geschrieben in dem ich eine 7-Segm-Anzeige betreibe. Sie soll "0" anzeigen und solange ich eine Taste drücke soll die entsprechende Zahl von 1..8 leuchten. Der Kontroller sollte folgendes machen: wenn ich z.B. am Ausgang PortB 0b00000001 ausgebe, dann sind die Pins1..7 = 0 also 0V und Pin0 = 1 also 5V. Die Spannung kommt aber nur auf max. 1,2V (ohne angeschlossene LED), was bedeutet, bei 5V sollten die LED's ausgehen da ich aber nur ca. 1V habe werden sie nur ein klein wenig dunkler - bei genauem Hinsehen. Kann mir jemand einen Tipp geben oder weiss vielleicht sogar, warum der Kontroller an den Ausgangspins nicht volle 5V erreicht? Falls es von Interesse sein sollte, ich hab das Programm angehangen. Gruss Uwe
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.