Hallo,
Als Anfänger mit Microcontoller und c. Ich werde zum erstmal ein
Bootloader auf einem mysmartcontrol mit atmega8 avr produkte schreiben.
Das Programm soll nur Hallo am Hterm senden.
Das Uart-software habe ich schon geschrieben und lauft ganz gut auf
Stk500.
Jetzt weiss ich nicht wie ich anfangen soll und womit ich Anfangen muss
um meinem Bootloader zu schreiben.
Habe ich schon SPI im Datenblatt gelesen, leider sind die Sache noch
durcheinander in meinem Kopf.
Ich danke euch für eueren Hilfe
Grüß
danke für der Tipp
war ich schon und habe den Projekt Bootloader von:
Beitrag "Bootloader ATmega168"
genommen und für Atmega8 wie er sagte angepasst.
aber wie lade ich dann zu meinem mysmartcontrol, weil er nur einen usb
anschluss hat mysmartcontrol und ist an com3 der PC.
mit AVRStudio finde ich mein Plattform nicht
gast schrieb:
> aber wie lade ich dann zu meinem mysmartcontrol,
Normalerweise genauso wie jedes andere Programm auch. Die
Programmiersoftware entnimmt die Position des Programms aus dem Programm
selbst.
Danach müssen noch ein paar Fuses angepasst werden, damit der µC auch
weiß, dass er einen Bootloader hat.
Habe gerade die Produktbeschreibung zu deinem Board gelesen.
Das Teil hat doch schon einen Bootloader drauf!
Also lass besser die Finger davon, bzw. sieh in der Doku nach, wie man
den Bootloader benutzt!
Ja genau!
hat das Teil einen Bootloader und auch ein .EXE programm Tool.
Habe ich sogar genutzt um meinem Programm zu brennen, so weit klappt
alles enwandfrei.
Nur das durch die Uart bekomme ich nur wirre Zeichen am Hterm.
Dachte ich dann, das es mit meiner Frequenz zu tun hat, weil mit STK500
benutze ich eine externe frequenz von 4 Mhz und die platine ist mit
3686400 Hz.
Also habe ich die Fuse eingestellt, leider war es nicht möglich die
Fuses einszustellen.
Habe ich dann vom Platine die 3686400 Hz frequenz raus gelöt und eine 4
Mhz da drauf gelötet. Dann ging nicht mehr der Bootloader.
Habe ich wieder raus genohmen und die 3686400 Hz frequenz wieder gelöt
und bootloader war wieder möglich.
Habe ich dann bei myavr angerufen, und der Techniker dort hat mir
gesagt, dass mann nicht durch das programm Tool die fuse setzen kann.
Und die Platine ist so eingestellt dass der atmega8 nur extern mit die
3686400 Hz frequenz arbeiten kann.Und dann wenn ich eine andere frequenz
möchte, muss ich dann durch ISP programmieren.
Deswegen bin ich auf die idee gekommen.
viele grüsse
gast schrieb:
> Deswegen bin ich auf die idee gekommen.>
Und wie wäre es, wenn du dein Programm so umstellst, dass dort nicht von
4Mhz sondern von den 3.6irgendwas Mhz ausgegangen wird.
Wäre das zu simpel, oder wie?
Danke für deinen Hilfe
Das war meine erste Lösung frequenz umzustellen, leider ging nicht.
Das selber Programm lauft gut auf Stk500, aber nicht auf
mySmartController
vielleicht liegt das Fehler wo anders?!?!
Hier unten meinem Code:
1
#ifndef F_CPU
2
#warning "F_CPU was not defined yet, now make up with 3686400"
3
#define F_CPU 3686400L // 4000000 Systemtakt in Hz
> #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) //Error per thousand
11
>
12
>
13
> #if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
14
> #error Systematic error in the baud rate more than 1% and thus too high!
15
> #endif*/
Warum lässt du denn das Makro nicht seine Arbeit machen und den
richtigen UBRR_VAL Wert ausrechnen? Nein, stattdessen muss da wieder mal
eine Konstante (25) her, die natürlich bei 3.6864 Mhz falsch ist.
Lass doch den Compiler die Drecksarbeit machen! Der macht das sehr
zuverlässig und vergisst auch nichts, wenn sich mal die Taktfrequenz
ändert.
habe ich so gemacht weil mit dem Makro ging auch nicht. Und als ich per
gerechnet habe, habe ich mir dann entschieden den Wert Ohne Makro
einzugeben.
Sonst geht auch nicht wenn ich die Makro benutze.
Gruß
>> habe ich so gemacht weil mit dem Makro ging auch nicht. Und als ich per> gerechnet habe, habe ich mir dann entschieden den Wert Ohne Makro> einzugeben.
Das kann ich mir nicht vorstellen.
Wenn es mit 25 geht, dann geht es auch mit dem Makro.
Denn der Ausdruck im Makro, wenn man ihn ausrechnet, ergibt 25.
Bei 4 Mhz!
Bei 3.68Mkhz kommt da aber 23 raus und das ist auch der korrekte Wert
für 3.68Mhz
>Das kann ich mir nicht vorstellen.>Wenn es mit 25 geht, dann geht es auch mit dem Makro.>Denn der Ausdruck im Makro, wenn man ihn ausrechnet, ergibt 25.>Bei 4 Mhz!>Bei 3.68Mkhz kommt da aber 23 raus und das ist auch der korrekte Wert>für 3.68Mhz
Genau, ich bin mit dir vollig einverstanden, das mit dem Makro 23
rauskommt. Und ist richtig.
Nur dass entweder mitBei 4Mkhz kommt da 25 oder Bei 3.68Mkhz kommt da 23
bekomme ich immer wirre Zeichen.
Ich habe die Makro vorher nur weg gemacht um zu prüfen ob es an meiner
Frequenz liegt!?!?
Leider ging immer nicht!!
Gruß
Moooment.
Ich denke das ganze funktioniert, wenn du es mit 25 auf dem STK-500 bei
4Mhz laufen lässt?
Wo liegt dann das Problem.
Du stellst im Code die Frequenz auf 3.68Mhz um, compilierst neu und
brennst es in die Schaltung. Dass diese Version auf dem STK-500 nicht
mehr funktnionieren wird ist klar. Denn auf dem STK-500 läuft der µC ja
mit 4Mhz und nicht mit 3.68Mhz.
Aber die 3.68 Version muss auf deiner Standalone Version funktionieren,
denn die läuft ja (hoffentlich) auch mit 3.68Mhz.
Du hast also 2 Programmversionen. Eine für 4Mhz compiliert und eine für
3.68Mhz compiliert. Und natürlich läuft jeder der beiden Versionen nur
auf der jeweils für sie richtigen Hardware.
Aber damit du beim Umstellen der F_CPU im Programm nicht allzuviel
Arbeit hast, brauchst du das Makro.
Nochmal zur Verständnis:
Du hast einen Atmega8 am STK-500 mit 4Mhz Takt?
Dort hast Du ein Programm drauf, welches den Text "Hallo" auf dem UART
ausgibt und welchen Du dann im Hterm sehen kannst?
Ist dort der gleiche Bootloader drauf wie auf dem anderen Board?
Jetzt hast Du noch einen mysmartcontrol. Dieser hat ebenfalls einen
Atmega8, wird jedoch mit 3.68Mhz getaktet?
Dort soll das gleiche Programm (andere Version für anderen Takt) laufen?
Liefert dieser fünf wirre Zeichen oder viel mehr?
Könnte es sein, dass dies die Bootloader-Kommunikation ist, der aus
irgend einem Grund nicht in das Programm weiter springt, sondern in
seinem Modus bleibt und dich dann mit diesen "binären" Zeichen begrößt?
>Aber die 3.68 Version muss auf deiner Standalone Version funktionieren,>denn die läuft ja (hoffentlich) auch mit 3.68Mhz.
ja ich verstehe was du meinst.
leider funktioniert die 3.68 Version nicht auf mysmartcontrol atmega8
3,68 Mhz.
Frequenz Baudrate habe ich schon alles nachgeprüft.
Code ist genau wie gepost.
Gruß
gast schrieb:
> Also habe ich die Fuse eingestellt, leider war es nicht möglich die> Fuses einszustellen.
Dann liegt es wohl daran. Oder hast Du das nun hinbekommen?
Kommt auch der richtige Takt beim Prozessor an (eventuell nur 1/8)?
Mal mit LED und Timer überprüfen => 1Hz Blinkfrequenz.
gast schrieb:
> leider funktioniert die 3.68 Version nicht auf mysmartcontrol atmega8> 3,68 Mhz.
Dann sollte man als allererstes mal die 3.68 Mhz überprüfen
compilieren, auf den mysmart brennen und laufen lassen.
Blinkt die LED im Sekundentakt (1 Sek ein, 1 Sek aus) oder sind es eher
3 Sekunden? Oder ist es vielleicht sogar viel weniger.
Wenn das gefühlsmässig mit der 1 Sekunde in etwa hinkommt:
Mit einer Stoppuhr bewaffnen. Beim LED-ein starten und 10 oder 20
Blinker mitstoppen. Im Idealfall bleibt deine Uhr nach dem 20.ten
Blinker ziemlich genau bei 39 Sekunden stehen. Dann kann man schon
ziemlich genau sagen, ob der µC auch wirklich mit 3.68Mhz läuft.
gast schrieb:
> Frequenz Baudrate habe ich schon alles nachgeprüft.> Code ist genau wie gepost.
*****
Wenn er genau wie gepostet war, dann war er falsch :-)
Denn für 3.68Mhz hätte bei UBRR_VAL 23 stehen müssen und nicht 25
Hallo Karl heinz Buchegger,
entschuldigung aber gestern habe ich kein Zeit mehr gehabt.
Ich habe das Programm gerade auf mySmartController gebrannt.
Die LED Blinken im Sekundentakt (1 Sek ein, 1 Sek aus).
Was bedeutet dass?
Das ich als frequenz 1Mhz drin habe?
1
#define F_CPU 3686400L
2
3
#include<avr/io.h>
4
#include<util/delay.h>
5
6
intmain()
7
{
8
DDRB=0xFF;//was auch immer du brauchst um an einem Port eine LED
9
//ansteuern zu können
10
11
while(1)
12
{
13
PORTB=0xFF;//was auch immer du tun musst um die LED
14
//einzuschalten
15
16
_delay_ms(1000);
17
18
PORTB=0x00;//was auch immer du tun musst um die LED auszuschalten
gast schrieb:
> Hallo Karl heinz Buchegger,>> entschuldigung aber gestern habe ich kein Zeit mehr gehabt.> Ich habe das Programm gerade auf mySmartController gebrannt.> Die LED Blinken im Sekundentakt (1 Sek ein, 1 Sek aus).>> Was bedeutet dass?>> Das ich als frequenz 1Mhz drin habe?
Nein.
Es bedeutet, dass Dein Quarz verwendet wird (sonst wären es 8MHz mit
internem Oszillator bzw 1MHz wenn doch die DIV8-Fuse gesetzt ist).
"(1 Sek ein, 1 Sek aus)" bedeutet zunächst nur etwa 4MHz (ich weiß
nicht, ob man mit bloßem Auge die 4MHz von 3,6MHz unterscheiden kann -
außer man hat ein Vergleichsnormal).
Hast Du mehrere Blinkperioden (zB 20) mit der Stoppuhr verglichen und
stimmt die Gesamtzeit immer noch, sind es genau 3,6MHz.
>Hast Du mehrere Blinkperioden (zB 20) mit der Stoppuhr verglichen und>stimmt die Gesamtzeit immer noch, sind es genau 3,6MHz.
ja es steht genau nach dem 20.ten Blinker ziemlich genau bei 39
Sekunden.
Mein Frequenz ist dann genau 3.68MHz, warum geht dann das Programm nicht
auf die Platine
Unter ist der code
1
#ifndef F_CPU
2
#warning "F_CPU was not defined yet, now make up with 3686400"
Karl heinz Buchegger schrieb:
>Wenn das gefühlsmässig mit der 1 Sekunde in etwa hinkommt:>Mit einer Stoppuhr bewaffnen. Beim LED-ein starten und 10 oder 20>Blinker mitstoppen. Im Idealfall bleibt deine Uhr nach dem 20.ten>Blinker ziemlich genau bei 39 Sekunden stehen. Dann kann man schon>ziemlich genau sagen, ob der µC auch wirklich mit 3.68Mhz läuft.
Wie kommst du drauf, dass wenn der µC auch wirklich mit 3.68Mhz läuft,
muss nach dem 20.ten Blinker ziemlich genau bei 39 Sekunden stehen.
Ich habe die delay Datei aufgemacht um mit der Funktion _delay_ms(double
__ms) die Rechnung vorzuziehen, leider kriege ich nichts.
Kannst du mir bitte erklären!?!
gruß
gast schrieb:
> Karl heinz Buchegger schrieb:>>>Wenn das gefühlsmässig mit der 1 Sekunde in etwa hinkommt:>>Mit einer Stoppuhr bewaffnen. Beim LED-ein starten und 10 oder 20>>Blinker mitstoppen. Im Idealfall bleibt deine Uhr nach dem 20.ten>>Blinker ziemlich genau bei 39 Sekunden stehen. Dann kann man schon>>ziemlich genau sagen, ob der µC auch wirklich mit 3.68Mhz läuft.>> Wie kommst du drauf, dass wenn der µC auch wirklich mit 3.68Mhz läuft,> muss nach dem 20.ten Blinker ziemlich genau bei 39 Sekunden stehen.
Er kommt darauf, weil _delay_ms(1000) für 1 Sek verzögert, aber nur
dann, wenn F_CPU auch mit dem tatsächlichen Takt übereinstimmt. Wenn
z.B. F_CPU auf 8000000 steht, der Takt aber tatsächlich 1 MHz ist, dann
verzögert _delay_ms(1000) für 8 Sekunden statt für eine.