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 :(
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?
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.
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.
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.
> 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.
@ 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.
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.
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.
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.
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.
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.
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...
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.
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/
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.