Anfänger - einfacher Aufbau mit LEDs und ATmega8 geht nicht

Gast #738639
Lesenswert?

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 ;)
Angehängte Dateien:
Gast #739273
Lesenswert?

@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
#739303
Lesenswert?

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.
Gast #739621
Lesenswert?

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?
Persönliche Seite #739657
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren