Usart

ThrashJan

Neues Mitglied
22. Dez. 2010
5
0
0
Sprachen
Guten Tag zusammen :flowers: Nettes Forum habt ihr hier!

Ich habe mir vor ein paar wochen das Mega128-USB Board bestellt und bin soweit echt zufrieden! Macht was es soll und wird mir hoffentlich noch mal später bei meiner Gesellenprüfung behilflich sein :p

Nur eine Frage steht im Raum, bei der mir keiner helfen will/kann...

Wie setze ich mein Applikationsprogramm softwareseitig wieder zurück, also ein Sprung zum Bootloader? Ich kann mich mit UART echt nicht wirklich aus.
Bis jetzt habe ich immer den Pin PG4 brav beim Reset auf Masse gezogen, aber auf Dauer ist das auch nicht das wahre, vor allem wenn man weiß, dass es viel komfortabler geht ;)

Hoffe jemand hat nen kleinen Code-Schnipsel für mich, der mir endlich ein Licht aufgehen lässt.

Vielen Dank schon mal, Jan
 
Hallo Jan,

willkommen in unserem Forum :)

Ich habe hier im Forenbreich glaube Beispiele in C und Assembler, oder ich hatte welche in einen angehängten Zip-File, hmmm es kann sein, dass ich beim Aktualisieren einer Version die Beispiele nicht mehr beigefügt habe. Ich glaube in Bascom gibt es auch irgendwo eine Lösung, ich kann da nochmal schauen, habe gerade nur keine Zeit.

Mit welcher Sprache programmierst du denn?

Grüße,
Dirk
 
Hallo Jan,

welcome aboard :hello:

Grüße,
Markus
 
Maaahlzeit!
Hätt ja schon heut morgen zurückgeschrieben, aber leider war ja das Forum down :( ohje ohje...

Naja gut, wieder zur Sache!
Ich bin gerade dabei, den mega128 in C zu programmieren. Bin noch kein Genie beim proggen, aber für meine Anforderungen reicht es noch aus ;-)

Hab seit einiger Zeit hier im Forum rumgesucht, ob es wohl mal ein Beispiel gibt, wie der UART initialisiert wird und wie man in der Applikation wieder in den Bootloader springt. Hab die Grundthematik auch ein paar mal gefunden, nur wurde da leider wieder darauf verwiesen, dass das schon irgendwo im Forum steht. Nach zwei Tagen Suche hab ich dann mal diesen Thread eröffnet. Hoffe das lässt sich klären.

Noch ne schöne Vorweihnachtszeit euch allen! :dance3:
 
Hallo Jan,

hier hast du die passende Lösung für das MEGA128-USB Mikrocontrollermodul in C, ich habe das Beispiel auch angehängt.

Bevor du zum Bootloader springst, musst du die Interrupts global abschalten (CLI) und ggf. den Watchdog abschalten.

Wünsche ebenfalls eine schöne Vorweihnachtszeit,
Dirk



CodeBox C


#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>


void usart_init(void);
void usart_write_char(char c);
void usart_write_str(char *str);


// Start Bootloader
// entry point word address 0xFFF0, byte address 0x1FFE0
void (*StartBootloader)(void)=(void*)0xFFF0;


int main (void)
{

uint8_t data;

usart_init();

while (1)
{

if (UCSR1A & (1<<RXC1))
{

data = UDR1;

if (data == 'b') {
cli(); // disable global interrupts
StartBootloader(); // start bootloader, entry point word address 0xFFF0
}

}

return 0xFF;
}





#define UBRR1_VAL 3 // 250kBit/s


void usart_init(void)
{

UBRR1H = UBRR1_VAL >> 8;
UBRR1L = UBRR1_VAL & 0xFF;
UCSR1B |= (1<<TXEN1) | (1<<RXEN1); // enable transmitter and receiver
UCSR1C |= (1<<UCSZ10) | (1<<UCSZ11); // asynchronous transfer 8N1

}


void usart_write_char(char c)
{

while(!(UCSR1A & (1<<UDRE1)));
UDR1 = c;
return;
}


void usart_write_str(char *str)
{
while (*str)
{
usart_write_char(*str++);
}
return;
}



 

Anhänge

  • main.zip
    650 Bytes · Aufrufe: 23
Daaaaaaanke danke =) bin begeistert!

Sieht ja gar nicht so schwer aus! ich schau mir das mal gleich zu haus an! Hab nu Feierabend und darf mich durch das norddeutsche Schneechaos kämpfen!

Vielen Dank noch mal für die schnelle Hilfe.

LG Jan
 
So, ich wollte noch mal auf den geposteten Code zurückkommen.
Der hat mir übrigens gut geholfen =)

Nur fehlt in der Main Funktion ein "}" wenn ich mich nicht irre. Wäre schön, wenn das noch geklärt wird. Für Leute die ähnlich grün hinter den Ohren sind wie ich und vllt. auch nach der UART Lösung suchen, wär das doch ganz erfreulich ;-)

Allen noch einen entspannten Dienstag!
LG Jan
 
Hallo Jan

vor return 0xFF machst du eine '}', die schließt die while(1)-Schleife. Ich hatte den Source schnell zusammenkopiert, da ist mir die Klammer verlorengegangen ;)

Grüße,
Dirk
 
Vielen Dank für die Klarstellung, so lässt sich der Code auch problemlos kompilieren. Wollen wir mal hoffen, dass das auch so bleibt und nicht wieder Klammern raus purzeln :p

Schönen Mittwoch noch!
LG Jan
 
nicht wieder Klammern raus purzeln

... und wenn .... dann weiss Du ja jetzt, nach was Du suchen musst.

Für die Klammern gibt es eine gute und einfache Regel. Geschweifte Klammern in C bzw. auch C++ oder Java usw. sind sogenannte Blockgrenzen. Egal ob ein IF-Block oder ein FOR-Block oder ein LOOP-Block..... Jedes Öffnen eines Blocks muss durch das Schließen eines Block abgeschlossen werden!
Ansonsten gibt es nur Murx und meistens meckert der Compiler an Stellen welche man nicht versteht.

Also .... immer zuerst Klammern kontrollieren.

Grüße,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)