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 ;)
@ 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?