Forum: Mikrocontroller und Digitale Elektronik Nur eine von 8 LEDs leuchtet. Programmfehler?


von Ben E. (der_ben)


Lesenswert?

Hallo,
ich habe unter Vorlage ein kleines Programm in Assembler geschrieben 
welches mir 5V auf PORTD geben soll. Es funktioniert aber leider nicht. 
Da ich gerade anfange Assembler und die Welt der µC zu erlernen finde 
ich den Fehler einfach noch nicht. Es wäre schön, wenn mir jemand eine 
kleine Hilfestellung geben könnte :)

Hab den µC mit AtmelStudio6 geflasht und dann einen Reset durchgeführt.
Leider leuchtet nur die LED an Pin0. An PIN1 schwach und darüber hinaus 
gar nicht mehr :(

1
;-------------------------------------------------------------------------------
2
;  Einbinden der controllerspezifischen Definitionsdatei
3
;-------------------------------------------------------------------------------
4
.NOLIST        ;List-Output ausschalten
5
.INCLUDE "m328Pdef.inc"    ;AVR-Definitionsdatei einbinden
6
.LIST        ;List-Output wieder einschalten
7
8
;-------------------------------------------------------------------------------
9
;       Organisation des Datenspeichers (SRAM)
10
;-------------------------------------------------------------------------------
11
;.DSEG                          ;was ab hier folgt kommt in den SRAM-Speicher
12
;TAB1:  .BYTE  100              ;100 Byte grosse Tabelle im Datensegment
13
14
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15
;       Programmspeicher (FLASH)     Programmstart nach RESET ab Adr. 0x0000
16
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
.CSEG                           ;was ab hier folgt kommt in den FLASH-Speicher
18
.ORG  0x0000      ;Programm beginnt an der FLASH-Adresse 0x0000
19
RESET1:  rjmp  INIT    ;springe nach INIT (ueberspringe ISR Vektoren)
20
21
;-------------------------------------------------------------------------------
22
;  Sprungadressen fuer die Interrupts organisieren (ISR VECTORS)  
23
;-------------------------------------------------------------------------------
24
        ;Vektortabelle (im Flash-Speicher)
25
;.ORG   INT0addr                ;interner Vektor fuer INT0 (alt.: .ORG 0x0002)
26
;       rjmp    ISR_I0          ;Springe zur ISR von INT0
27
28
;-------------------------------------------------------------------------------
29
;  Initialisierungen und eigene Definitionen
30
;-------------------------------------------------------------------------------
31
.ORG    INT_VECTORS_SIZE        ;Platz fuer ISR Vektoren lassen
32
INIT:
33
.DEF  Zero = r15    ;Register 15 wird zum Rechnen benoetigt
34
  clr  r15    ;und mit Null belegt
35
.DEF  Tmp1 = r16    ;Register 16 dient als erster Zwischenspeicher
36
.DEF  Tmp2 = r17    ;Register 17 dient als zweiter Zwischenspeicher
37
.DEF  Cnt1 = r18    ;Register 18 dient als Zaehler
38
.DEF    WL = r24                ;Register 24 und 25 dienen als universelles
39
.DEF    WH = r25                ;Doppelregister W
40
41
  ;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts)
42
  ldi  Tmp1,HIGH(RAMEND)  ;RAMEND (SRAM) ist in der Definitions-
43
  out  SPH,Tmp1    ;datei festgelegt  
44
  ldi  Tmp1,LOW(RAMEND)
45
  out  SPL,Tmp1
46
47
;alle Pins von PortD als Ausgang initialisieren
48
ldi    Tmp1,0xFF  ;alle Bits im Zwischenspeicher auf Eins
49
out    DDRD,Tmp1  ;DDRD = 0b11111111; alle Pins Ausgang
50
51
;-------------------------------------------------------------------------------
52
;  Hauptprogramm
53
;-------------------------------------------------------------------------------
54
MAIN:
55
ser    Tmp1  ;alle Bits im Zwischenspeicher auf Eins
56
out    PORTD,Tmp1    ;PORTD = 0b11111111
57
58
    ;Alle PortD-Pins auf High setzen (8 LEDs ein)
59
END:
60
rjmp  END    ;Endlosschleife
61
62
        ;Ende des Hauptprogramms (falls keine Endlosschleife im Hauptprogramm)
63
;END:  rjmp  END    ;Endlosschleife
64
65
;-------------------------------------------------------------------------------
66
;  Unterprogramme und Interrupt-Behandlungsroutinen
67
;-------------------------------------------------------------------------------
68
;.INCLUDE "SR_TIME_16M_sample.asm"     ;Zeitschleifenbibliothek einbinden
69
70
;-------------------------------------------------------------------------------
71
;       Tabellen im Programmspeicher (Flash)
72
;-------------------------------------------------------------------------------
73
;TAB:  .DB    "Hallo"
74
75
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76
.EXIT        ;Ende des Quelltextes

von Markus (Gast)


Lesenswert?

Ben E. schrieb:
> Leider leuchtet nur die LED an Pin0. An PIN1 schwach und darüber hinaus
> gar nicht mehr

Hardwarefehler?
Wie sieht die Schaltung aus?

von c-hater (Gast)


Lesenswert?

Ben E. schrieb:

> ich habe unter Vorlage ein kleines Programm in Assembler geschrieben
> welches mir 5V auf PORTD geben soll. Es funktioniert aber leider nicht.

Es ist aber korrekt und erfüllt genau die von dir beabsichtigte 
Funktion.

Es muß sich also um ein Problem mit der Hardware handeln.

Oder du hast nicht wirklich das Programm geflasht, dessen Quelltext du 
gepostet hast. Hast du eventuell vergessen, es nach den Änderungen (da 
ist ja einiges auskommentiert) neu zu übersetzen bzw. hast nicht des 
Ergebnis der Neuübersetzung geflasht?

von Ben E. (der_ben)


Angehängte Dateien:

Lesenswert?

Hier der Aufbau der Schaltung im Anhang.
In AtmelStudio mach ich den Build und flashe dann über Device 
programming.
Dann bei Memories auf Program.
Flash und Verify ist OK.
Das gleiche bei Fuses und Lock bits. Program und Verify OK.
Seltsam ist, dass die orangene LED (L) durchgehend blinkt. Auch nach 
einem Reset.
Hardware ist ein Sainsmart UNO R3.

von c-hater (Gast)


Lesenswert?

Ben E. schrieb:

> Hier der Aufbau der Schaltung im Anhang.

PortD0..7 liegt auf Pin0..7? Sicher nicht bei dem Mega328P, den die 
Firma Atmel produziert...

> In AtmelStudio mach ich den Build und flashe dann über Device
> programming.

Ich weiß nicht, wie es beim Studio6 ist, aber beim 4er reicht das allein 
nicht unbedingt, um das "richtige", also das gerade erzeugte Hexfile zu 
flashen.
Da arbeitet das Flashmodul unabhängig vom aktuell offenen Projekt und 
will gesondert über das zu flashende Hexfile informiert werden.

von (prx) A. K. (prx)


Lesenswert?

Ist hier nicht das Problem, kommt sonst aber bestimmt noch: Beim Mega328 
und allen anderen Typen mit mehr als 8KB Flash kriegt man mit RJMP in 
der Vektortabelle über kurz oder lang Probleme.

von Ben E. (der_ben)


Lesenswert?

> PortD0..7 liegt auf Pin0..7? Sicher nicht bei dem Mega328P, den die
> Firma Atmel produziert...

Am Chip selbst sind es die Pins 2,3,4,5,6,11,12,13
Auf dem Board sind die auf der Platine mit PD0 - PD7 deklariert.
Sry, das hatte ich in der Zeichnung falsch angegeben.

Hab jetzt nochmal probiert und im Flashmodul das HEX.File aus dem 
Releaseordner angewählt und geflasht. Immer noch kein Erfolg.
Stelle die Verbindung per USB her. Kann zwar die Device Information 
auslesen und die Verify durchführen, bekomme aber unter Tool Information 
nur den Debug host und den Debug port angezeigt. Bei Connection steht 
nix.
Hab dann jetzt auch mal die Spannungen gemessen am Board. An PD0 hab ich 
4,91V, an PD1 4,87V und ab PD2 0,02V, also nix mehr. Kurios ist auch, 
dass wenn ich eine LED mit Vorwiderstand direkt an den 5V-Pin 
anschließe, (wo ich ebenfalls 4,91V messe) diese dort heller erscheint, 
wie an PD0 (4,91V).

>Ist hier nicht das Problem, kommt sonst aber bestimmt noch: Beim Mega328
>und allen anderen Typen mit mehr als 8KB Flash kriegt man mit RJMP in
>der Vektortabelle über kurz oder lang Probleme.

Danke für den Tip. Behalte mir das mal auf dem Schirm. Interessiert mich 
warum.

von xxx (Gast)


Lesenswert?

@ Ben E

Hast du schon mal ins Datenblatt geschaut???

Könnte es nicht sein, das der ganze Port D nicht mehr als 100mA
liefert. 8 x 20 mA sind evtl. schon zu viel wenn alle gleichzeitig
leuchten sollen.

Von dem abgesehen wäre es besser die LED's zu drehen. Also alle
Anoden gegen VCC, weil so der einzelne Ausgang mehr Strom treiben kann.

von Lars R. (larsr)


Lesenswert?

Ben E. schrieb:
> Kurios ist auch,
> dass wenn ich eine LED mit Vorwiderstand direkt an den 5V-Pin
> anschließe, (wo ich ebenfalls 4,91V messe) diese dort heller erscheint,
> wie an PD0 (4,91V).

Das ist nicht kurios. Messe einmal die Spannung mit angeschlossener LED. 
So ein Port des Controllers ist nicht unbegrenzt belastbar.

Außerdem ist es üblich die LED gegen die 5 Volt zu schalten, so dass der 
Controller den Port auf "low" bringen muss um die LED leuchten zu 
lassen.

von c-hater (Gast)


Lesenswert?

Ben E. schrieb:

> Kurios ist auch,
> dass wenn ich eine LED mit Vorwiderstand direkt an den 5V-Pin
> anschließe, (wo ich ebenfalls 4,91V messe) diese dort heller erscheint,
> wie an PD0 (4,91V).

Miß' an PD0 während die LED leuchtet! Dann wirst du eine deutlich 
geringere Spannung messen.

Und das ist völlig normal. Das ist einfach die Auswirkung des 
Innenwiderstand des Ausgangstreibers des Pins. Stark vereinfacht kannst 
du den mit etwa 40Ohm kalkulieren.

Dieser Effekt hat mit deinem Problem nichts zu tun.

von (prx) A. K. (prx)


Lesenswert?

Lars R. schrieb:
> Außerdem ist es üblich die LED gegen die 5 Volt zu schalten,

Das war vor langer Zeit mal üblich und es gibt wohl auch heute noch µCs, 
die runter mehr können als rauf. Aber AVRs ist das egal.

von Hubert G. (hubertg)


Lesenswert?

Ben E. schrieb:
> Seltsam ist, dass die orangene LED (L) durchgehend blinkt. Auch nach
> einem Reset.
> Hardware ist ein Sainsmart UNO R3.

Dann hast du immer noch das Standard-Programm drauf.

von Ben E. (der_ben)


Lesenswert?

Ja, irgendwie möchte das Programm nicht auf den Controller. Hab mal 
meine USB-Verbindung gemessen. Habe konstante 5,07V. Ich google mich mal 
weiter durch. Zumindest wird der Controller als Arduino UNO an COM12 
Port im Gerätemanager erkannt.
Hab den Strom mal gemessen. Hab bei geschalteter LED (nur eine an PD0) 
2,4mA und am 5V Pin 12,6mA. Würde ja bedeuten, dass ich 8 LEDs an PortD 
gleichzeitig schalten kann. Pro PIN 40mA, empfohlen 20mA und insgesamt 
200mA.
An PD1 (4,8V) messe ich allerdings nur 0,08mA mit einer LED. Naja, vllt 
liegts ja am vorinstallierten Programm und es ist kein Defekt.
Danke für den Tip mit dem Innenwiderstand. Dadurch verringert sich ja 
dann auch der Strom. Nur das der Unterschied so gewaltig ist, hätte ich 
nicht gedacht. Nur die 40 Ohm hauen dann wohl nicht so ganz hin mit dem 
gemessenen Strom. Sollten rechnerisch ja dann um die 11mA sein und nicht 
2,4mA die da durch die Schaltung fließen.

von Ben E. (der_ben)


Lesenswert?

Habs gerade mal mit dem Arduino IDE Programm gemacht und ein Basicscript 
(Fade) auf den Controller geflasht. Es funktioniert tadellos.
Also liegts an AtmelStudio6. Da ich aber anfangen möchte in Assembler zu 
programmieren bringt mir Arduino IDE nicht viel. Vllt hat ja jemand noch 
eine Idee wo ch vllt einen Fehler mache beim flashen mit AS6...

von Simpel (Gast)


Lesenswert?

Ich kenne die Ardu.Uno-IDE zwar nicht, aber in der Regel kann man 
einfach die compilierte, fremde *.hex-Datei dort irgendwo reinkopieren, 
bzw. den Pfad fürs Brennen umbenennen, so dass sie in den µC geflasht 
wird.

von Hubert G. (hubertg)


Lesenswert?

Vom AVR-Studio direkt über USB in den UNO zu laden, das wäre mit neu.
Das einfachste ist mit dem Programm Xloader die *.hex in den UNO zu 
laden.

Xloader gibt es hier: http://www.xloader.russemotto.com/

von Ben E. (der_ben)


Lesenswert?

Klappt mit XLoader einwandfrei. Vielen Dank.
Hatte den schon runtergeladen, aber dachte ich könnte alles mit AS6 
erledigen.
Da mein erstes Programm mit den 8 LEDs nun läuft bedanke ich mich bei 
allen für die freundliche Unterstützung.
Hoffe ich kann bald auch mal jemandem helfen.

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
Noch kein Account? Hier anmelden.