Go Down

Topic: 4 zu 16 Decoder in anderer Form (Read 14283 times) previous topic - next topic

R1der

Einige Verständnisfrage:

Wofür ist der Bootloader da?
Werden die Fuses beim Uploaden übertragen oder einmalig beim Installieren des Bootloaders?

Entschuldigt die Fragen, drehe mich mit dem ganzen Probieren und nicht verstehen im Kreis :smiley-roll-blue:

uwefed

Der Bootloader lädt des Programm auf den Microcontroller. Nach einem Reset wird er ausgeführt und kontrolliert ob über sie serielle Schnittstelle ein Ladevorgang ansteht.
Die Fuse-Bits können nicht über den Bootloader verändert werden. Sie werden Beim erstellen des Bootloaders gesetzt oder wenn Du willst kannst Du sie mittels eines ISP-Programmierers verändern.
Grüße Uwe

sth77

Der Bootloader ist vermutlich für den Erfolg der Arduino-Plattform verantwortlich. ;) Im Regelfall werden die AVR-Mikrocontroller über einen speziellen Programmer programmiert, meist ein ISP wie Atmels MKII. Neben dem zusätzlichen Hardwareaufwand und den damit verbundenen Kosten kommen so noch einige potentielle Fehlerquellen beim Anschluss hinzu. Gerade das stellt für Einsteiger eine gewisse Hürde dar.
Der Bootloader ist ein Programm, welches ab dem Systemstart bzw. Reset einige Sekunden an der seriellen Schnittstelle (UART) lauscht, ob ein neues Programm aufgespielt werden soll. Kommt nichts, wird das vorhandene Programm abgedudelt.
Nun gibt es natürlich das Henne-Ei-Problem: Wie kommt der Bootloader auf den AVR? Dies geschieht über die angesprochene In-System-Proogrammierung, und genau hier werden auch die Fuses gesetzt. Das haben die Jungs vom Arduino-Team bereits für dich erledigt oder vom Fertiger erledigen lassen. ;)
Trotzdem wird man der Funktionalität nicht beraubt, die Arduino-Platinen haben ja den 6poligen Programmierstecker beibehalten, dass man sich sein Board - auch unter Verzicht des Bootloaders - selbst programmieren kann., auch mit eigenen Fuses.

[edit] Da war wohl jemand schneller...
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

R1der

#48
Nov 20, 2013, 08:56 am Last Edit: Nov 20, 2013, 08:58 am by R1der Reason: 1
Danke für die Antworten.

Hier mein Chip-Setup:
Code: [Select]
##############################################################

atmega8a.name=Arduino NG or older w/ ATmega8 (standalone)

atmega8a.upload.protocol=stk500
atmega8a.upload.maximum_size=7168
atmega8a.upload.speed=19200

atmega8a.bootloader.low_fuses=0xE2
atmega8a.bootloader.high_fuses=0xDA
atmega8a.bootloader.path=atmega8
atmega8a.bootloader.file=ATmegaBOOT-prod-firmware-2009-11-07.hex
atmega8a.bootloader.unlock_bits=0x3F
atmega8a.bootloader.lock_bits=0x0F

atmega8a.build.mcu=atmega8
atmega8a.build.f_cpu=8000000L
atmega8a.build.core=arduino
atmega8a.build.variant=standard


Wie muss ich denn vorgehen, um den Controller über ISP zu programmieren?
Sind die Fuses dafür richtig gesetzt? Bzw. welche dafür gesetzt werden?
Als Programmer nehme ich dann ja den Arduino ISP in der IDE, oder?


sth77

#49
Nov 20, 2013, 09:21 am Last Edit: Nov 20, 2013, 09:23 am by sth77 Reason: 1
Mit dem Setzen der Fuses entscheidet man nicht, ob per ISP programmiert werden kann, das geht nahezu* immer. Wenn du wissen willst, was deine Fuses bewirken, kannst du auf http://www.engbedded.com/fusecalc gehen und den verwendeten Atmega8A wählen und unten in den Current Settings die Low-Fuses E2 und die High-Fuses A2 eintragen. Nach dem Klick auf "Apply values" werden entsprechend die Änderungen in den Listen vorgenommen.
Wie man Mit einem Arduino einen anderen Mikrocontroller per ISP beschreiben kann, ist hier im Tutorial ganz anschaulich erklärt: http://arduino.cc/en/Tutorial/ArduinoISP

*ich wollte jetzt ungern noch auf Lockbits und High-Voltage-Programmierung eingehen...
Mein verwaister Arduino-Blog: http://www.sth77.de/ - letzter Eintrag: Diamex-ISP in der irgendwann mal aktuellen Arduino-IDE 1.6.4

Hiswif

#50
Nov 20, 2013, 09:54 am Last Edit: Nov 20, 2013, 10:04 am by Hiswif Reason: 1
Heho,

da du nun ja den Bereich des Aurduino zu verlassen scheinst und versuchst mit den "Großen" spielen zu wollen, indem du selbst Schaltungen aufbaust und die Controller versuchst richtig zu Programmieren, möchte ich dir gerne ein paar wirklich nützliche Seiten mit auf deinen Weg geben.

Die Grundlagen zu AVR µC'S einschlieslich Standardaufbau und Beschaltung.
http://www.mikrocontroller.net/articles/AVR-Tutorial

Die Grundlagen zum Programmieren eines µC in C.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Die Grundlagen zu den Schieberegistern.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister
Interessant für dich auch der Abschnitt "Acht LEDs mit je 20mA pro Schieberegister"

Porterweiterung mittels Schieberegistern.
http://www.mikrocontroller.net/articles/Porterweiterung_mit_SPI

Die IDE schlechthin um µC zu programmieren. Wirklich sehr sehr komfortabel.
http://www.atmel.com/microsite/atmel_studio6/

Zur Shiftout Library möchte ich dir den Tipp geben das du dich eher an das Datenblatt des Schieberegisters hältst als an diese  wirklich schlechten beispiele. So ist es absolut unnötig den "Latch" Pin die ganze Zeit auf High zu halten und fürs Schreiben auf Low zu ziehen. Das kann dir außerdem noch einige Schwierigkeiten bereiten, wenn zum Beispiel durch eine Störung das Signal kurz auf Low fällt, wie es der Verfasser des tutorials ja selber erlebt als "flackern" der LED's.
Halte den Pin auf Low und nachdem du die Daten reingeschoben hast gibst du einen kurzen High impuls auf den Latch pin, das reicht. So ist es in jedem anderen Tutorial sowie im Datenblatt des Registers beschrieben und macht auch Sinn.
Dann brauchst du auch nicht diesen komischen Kondensator. Der ist für mich der größte Irrsinn den ich je gesehen habe. Datenblatt Falsch gelesen, den Begriff "Latchpin" mit CS verwechselt und das ganze Problem dann auch noch verschlimmbessert indem man einen Kondensator dazuklatcht der im Schlimmsten Fall das Tempo vermindert. Im Code sähe die änderung dann so aus:

Aus:
Code: [Select]
digitalWrite(latch_1,LOW);
shiftOut(data_1,clock_1,MSBFIRST,shift[8]);
digitalWrite(latch_1,HIGH);


Wird:
Code: [Select]

shiftOut(data_1,clock_1,MSBFIRST,shift[8]);
digitalWrite(latch_1,HIGH);
digitalWrite(latch_1,LOW);


Schon brauchst du keinen Kondensator und hast auch kein Flackern mehr auf den LED's. Warum das dem Verfasser des Tutorials noch keiner gesagt hat und warum das seit Jahren so falsch da drinn steht entzieht sich meiner Kenntnis.

Wenn du es noch schneller haben möchtest dann nimm nicht die Shiftout Lib sondern gleich Hardware SPI dann machst du richtig Tempo. Auf LED Matrizen lassen sich so hervorragend Animationen abspielen ;) Nurmal zur verdeutlichung der Geschwindigkeit ;)
http://www.youtube.com/watch?v=vyWbqJPbMe4&feature=youtu.be
Hier Besteht das ganze aus zwei 74hc595n am Arduino. Da Bild ergibt sich aus der zeilenweisen Darstellung. Im Video ist ein ganz kleines Flackern zu erkennen. In RL jedoch nichts davon zu sehen. Es Schaut aus wie ein stehendes Bild.

Grundsätzlich ist zu sagen das die Lernkurve am Beginn wirklich recht Steil ist, wenn du dich mit µC'S befasst. Hast du das aber ersteinmal hinter dir dann steht dir die ganze Wellt offen. Wichtig ist dabei nur das du lernen willst und vorallem das du keine Angst davor hast auch mal Fehler zu machen. Die kleinen Chips Kosten ja nicht viel ;) Am besten du bestellst die immer gleich im  Mehrfachpack ;) Da sind sie meist günstiger.
Bleibt dir nur noch ein Tipp zu geben.

DATENBLÄTTER SIND AB SOFORT DEINE BESTEN FREUNDE ;)

So nun ein wenig zur Offtopic ;)

Quote
Der Bootloader ist vermutlich für den Erfolg der Arduino-Plattform verantwortlich.


Würde ich so nicht ganz unterschreiben. Bootloader gibt es einige. Sogar wesentlich bessere, schlankere für spezielle Einsätze besser geeignete. Klar ist der Arduino Bootloader ein Teil des ganzen und trägt mit zum erfolg bei, der ganz große Erfolg des Arduino liegt jedoch in seinen Librarys.
Der Arduino flacht die Oben genannte Lernkurve gerade für einsteiger extrem ab. Man muss sich weder darum kümmern ob die Beschaltung des µC ordentlich ist, noch darum welches Register eingestellt werden muss und erstrecht nicht um die Fuses. Dies ermöglicht es unerfahrenen einsteigern relativ schnell und einfach ein Erfolgserlebniss zu haben und dinge zum laufen zu bewegen. Der Arduino ist halt ursprünglich nicht für Informatiker oder Elektroniker entwickelt wurden, sondern für Künstler um ihren Installationen Leben einzuhauchen ohne das diese sich großartig mit Mikrocontrollern befassen müssen. Das ganze merkt man heute noch. Dort liegt für mich der Erfolg des Arduino's.
Stellt euch mal vor wir müssten dem TE das rausschieben der Byte's über Software SPI oder Hardware SPI erklären ohne die Arduino Lib's dafür zu haben. Also alle Konfigurationen Per Hand machen in den Registern ;) Na, wer könnte das? ;)

Jetzt wünsche ich dem TE noch viel erfolg bei richtigen Einstieg in die µC welt und hoffe das er sich von ein paar rückschlägen nicht aufhalten lässt. Wie schon von anderen Gesagt wurde: Angefangen hat jeder von uns. Das einzige dumme was man machen kann ist nicht zu fragen, wenn man selbst nicht mehr weiter weiß.

MFG

His

mgcss

ohne jetzt jeden Beitrag im Detail gelesen zu haben: ich meine, dass BCD-Decoder wie der http://www.nxp.com/documents/data_sheet/74HC_HCT42_CNV.pdf
noch nicht genannt wurden. Die Dinger erschlagen die Ausgangs-Fragestellung eigentlich perfekt.

R1der

#52
Nov 20, 2013, 05:10 pm Last Edit: Nov 20, 2013, 05:18 pm by R1der Reason: 1
Juhuu... Hab meinen ersten µC als Standalone am laufen :smiley-red:

Jetzt habe ich folgendes Problem. Habe blink zum Test aufgespielt.

Jedoch sind die Puls/Pausezeiten im Sketch 1000ms, in real jedoch ca. 3,5s

Was kann ich falsch gemacht haben?
Betreibe den mit internem Osszillator bei 8MHz (hoffe ich zumindest)
mir ist klar, dass es dadurch ungenauer wird, aber doch so heftige Abweichungen?

So wäre es mir egal, der CHip soll aber in seinem Verwendungszweck Laufzeiten überwachen.

Anbei nochmal der MCU:

Code: [Select]
atmega8a.name=ATmega8-16PU (standalone without OSZ)

atmega8a.upload.protocol=stk500
atmega8a.upload.maximum_size=7168
atmega8a.upload.speed=19200

atmega8a.bootloader.low_fuses=0xE1
atmega8a.bootloader.high_fuses=0xD9
atmega8a.bootloader.path=atmega8
atmega8a.bootloader.file=ATmegaBOOT-prod-firmware-2009-11-07.hex
atmega8a.bootloader.unlock_bits=0x3F
atmega8a.bootloader.lock_bits=0x0F

atmega8a.build.mcu=atmega8
atmega8a.build.f_cpu=8000000L
atmega8a.build.core=arduino
atmega8a.build.variant=standard


EDIT: LowFuse auf 0xE4 für int. 8MHZ

R1der

Jetzt läuft es richtig.

Weiß nicht woran es lag, habe den Bootloader installiert und es läuft nun.

Go Up