Hallo, Ich arbeite im Moment das Tutorial auf diesen Seiten durch und habe leider bei den ersten Versuchen mit den LEDs und dann auch mit dem LCD keinen Erfolg gehabt. Ich habe mir dann gedacht ich schreibe mir ein ganz einfaches Porgramm, um zu testen ob wenigstens das funktioniert. Das Programm soll ganz simpel schauen, wo am Eingang B Spannungen anliegen und soll diese dann einfach auf die Ausgänge C übertragen. Also, wenn an PB4 eine Spannung anliegt, dann soll das dazu führen, dass auch an PC4 eine Spannung anliegt. PC2 soll immer ohne Spannung bleiben. Das Ergebnis ist, dass zwar an PC2 tatsächlich nie die LED leuchtet, an den anderen C-Ausgängen jedoch immer, unabhängig vom Zustand der B-Eingänge. Ich verwende einen ATmega8, diesen Aufbau zur Stromversorgung http://www.mikrocontroller.net/articles/Bild:Avr-schaltplan-1.gif und diesen ISP-Programmer http://s-huehn.de/elektronik/avr-prog/avr-seriell.gif und zwar über einen USB-Seriell-Wandler (was abartig langsam geht :D). Den Programmer entferne ich, nachdem ich das Programm übertragen habe, die LEDs sind alle mit Vorwiderstand an GND angeschlossen und funkionieren. War sehr blöd, als das einfache Programm auch nicht funkioniert hat :( aber ich hoffe ihr könnt mir helfen ;)
Ergänzung: Ich verwende PonyProg zum Übertragen des Programms, zum Erstellen der HEX-Datei verwende ich AVRStudio4.
Kannst du mal einen auszug aus deinem programm hier rein kopieren?
@ chris5787 (Gast) >War sehr blöd, als das einfache Programm auch nicht funkioniert hat :( >aber ich hoffe ihr könnt mir helfen ;) Dein Programm ist erstmal so OK. Wie legst du denn Spannung an dein PB4? Verbindest du es mit einem Draht mit GND bzw. VCC? Wenn ja, dann sollte es laufen. Anderenfalls AVR-Tutorial: IO-Grundlagen MFG Falk
@michaavr: kompletter Code ist beim ersten Post als Anhang dabei. @falk: Ja, ich benutze einfach einen Draht, um Spannung an die B-Eingänge zu legen. Was vielleicht noch wichtig ist: Ich habe das ganze auf ein Steckbrett aufgebaut, außer dem ISP-Programmer und der Spannungsversorgung, die wurden gelötet. Die 5-V-Spannungsversorgung ist diese hier http://www.mikrocontroller.net/articles/Bild:V_Regler.gif
chris5787 wrote: > @michaavr: kompletter Code ist beim ersten Post als Anhang dabei. > > @falk: > Ja, ich benutze einfach einen Draht, um Spannung an die B-Eingänge zu > legen. Ich interpretiere das mal so, dass du mit einem Draht den Pin mit Vcc (also mit +) verbindest. Es mnuss aber anders rum sein: Du musst mit einer Drahtbrücke nach Masse (also -) verbinden.
Aber warum? Zum Beispiel soll an PC1 die LED leuchten. Dafür verbinde ich PB1 mit Vcc, dann wird an dieser Stelle eine 1 eingelesen. Diese 1 wird dann an PC1 wieder ausgegeben, dort sollten dann also +5V anliegen. Und dann müsste die LED leuchten, denn diese ist folgendermaßen an PC1 angeschlossen: PC1 -- LED -- Widerstand -- GND Müsste doch so funktionieren oder?
chris5787 wrote: > Aber warum? Zum Beispiel soll an PC1 die LED leuchten. Dafür verbinde > ich PB1 mit Vcc, dann wird an dieser Stelle eine 1 eingelesen. Diese 1 > wird dann an PC1 wieder ausgegeben, dort sollten dann also +5V anliegen. > Und dann müsste die LED leuchten, denn diese ist folgendermaßen an PC1 > angeschlossen: > PC1 -- LED -- Widerstand -- GND > Müsste doch so funktionieren oder? Zwischen PB1 und Vcc würde ich noch einen Widerstand schalten. Wenn du zufällig PB1 mal aus Ausgang geschaltet hast und LOW ausgibst, hast du ohne Widerstand einen Kurzen. Wenn du zufällig am µC keine Vcc Spannung hast aber am PB1, quälst du die Schutzdioden des µC mit einem Kurzen. In deiner "High active" LED Schaltung muss die LED mit der Anode (langes beinchen) an PC1 angeschlossen sein. Soweit zur Hardware. Wenn trotzdem es nicht klappt, kann es auch an der Software liegen. In deinem Code.txt oben (den ich unten etwas lesbarer umgeschrieben habe) hast du an PORTB alle Pull-Ups aktiviert. Du hast an PINB immer logisch HIGH, egal ob PB1 an Vcc angeschlossen ist oder frei in der Luft bambelt. Nur wenn du PB1 mit GND verbindest, bekommst du LOW als Eingabe (s. Antwort von Karl heinz Buchegger).
1 | .include "m8def.inc" |
2 | |
3 | .org 0x0000 |
4 | rjmp reset |
5 | |
6 | reset: |
7 | ; Stack vorbereiten |
8 | ldi R16, LOW(RAMEND) |
9 | out SPL, R16 |
10 | ldi R16, HIGH(RAMEND) |
11 | out SPH, R16 |
12 | |
13 | ; PINB 0-7 Eingang |
14 | ldi R16, 0x00 |
15 | out DDRB, R16 |
16 | |
17 | ; PORTB 0-7 Pull-Ups aktivieren |
18 | ldi R16, 0xFF |
19 | out PORTB, R16 |
20 | |
21 | ; PORTC 0-7 Ausgang |
22 | ldi R16, 0xFF |
23 | out DDRC, R16 |
24 | |
25 | loop: |
26 | in R17, PINB |
27 | |
28 | ; alt, geht nicht |
29 | ; andi R17, 0b11111011 ; Wo steht die 0 ??? => PB2 manipulieren? |
30 | |
31 | ; Alternative1: PC1 toggeln durch PB1 |
32 | ldi R16, 0b00000010 |
33 | eor r17, r16 |
34 | |
35 | ; Alternative2: PC1 folgt PB1 |
36 | ; andi R17, 0b00000010 |
37 | |
38 | out PORTC, R17 |
39 | rjmp loop |
40 | |
41 | ; ENDE |
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.