Forum: Mikrocontroller und Digitale Elektronik Übergang von Assembler auf C


von Niki Hammler (Gast)


Lesenswert?

Hallo!

Nach langem Hin und Her hab ich es endlich geschafft: Ein Assembler 
Programm das mir eingegebene Zeichen (von PC) zurück schickt und dabei 
ein Aktivity-LED leuchtet ;))

Umso länger probiere ich aber schon, das ganze in C zu machen, da ich 
weitere Sachen dann auch in C machen will...beispielsweise wenn ein 
Zeichen kommt den zuerst in einen Buffer schreiben bis ein "Befehl" 
fertig ist und dann dementsprechend auf PORTC Pin 5 für eine Sekunde auf 
Saft schalten.

Jedenfalls hab ich im Moment das folgende C Programm: (AT90S2333)

#include <io.h>

#define CPU_CLOCK  4000000

void init_serial(void);
void init_io(void);

SIGNAL(SIG_UART_RECV)
{
  outp(inp(UDR), PORTB);
  //return 0;
}

int main(void)
{
  init_serial();
  init_io();
  //sbi(GIMSK,
  //_sei();
  asm volatile("sei");
  while(1);
  return(0);
}

void init_serial(void)
{
  sbi(UCSRB, RXEN);
  sbi(UCSRB, RXCIE);
  outb((CPU_CLOCK/(9600*16L)-1), UBRR);
}

void init_io(void)
{
  outp(0x80, DDRB);
}

1.) Stimmt die Interrupt Handler Routine?? Ist damit alles getan? Wird 
die Tabelle, die sonst in Assembler mit ".org 0x08" geschrieben werden 
müsste, automatisch geschrieben??
Der Compiler beklagt sich dass kein return Wert definiert ist, Standard 
zu "int" und dass dieser keinen Rückgabewert liefert. Was soll ich da 
machen? (Ich hasse "Warnings"...einfach so?
int SIGNAL(SIG_UART_RECV)
{
  // Code
  return 0;
}

2.) Wie man sieht sollte das Programm einfach die LEDs an PORTB blinken 
lassen wenn was reinkommt...Wäre das so richtig oder muss man ein Delay 
oder ähnliches einbauen (dass es ja in ASM auch nicht gibt)

3.) Passt es wenn ich zum globalen Aktivieren der Interrupts asm 
volatile("sei"); nehme?

4.) Muss man nicht extra ein Bit in GIMSK setzen? Findet man nirgens was 
darüber...wenn ja wie geht das und VOR ALLEM welches Bit ist es (im 
Datenblatt schon geschaut, es gibt so viele Möglichkeiten)

5.) Ich habe nirgendwo ein funktionierendes C Programm für den UART 
Empfang über Interrupts für einen AT90S2333 gefunden (der verwendet 
andere Registernamen, Adressen unsw). Kennt jemand ein einfaches 
Programm das ca diesen Zweck von oben erfüllt (d.h. zum testen) und das 
funktioniert?

Vielen Dank,

Niki

von Andreas (Gast)


Lesenswert?

Hallo!

1a.) Wird automatisch geschrieben.
1b.) Der Compiler erkennt nicht, dass das eine Interrupt Routine sein 
soll und behandelt es als normale Funktion. Include sig-avr.h und 
interrupt.h, dann geht's.
2.) siehe 1b.
3.) Kannst sei(); nehmen, kommt aber auf's gleiche raus.
4.) Nein, ich denke nicht.
5.) Ja, deines nachdem du es verbessert hast! ;-) Um anderen die Mühe zu 
ersparen, kannst du es ja in der Codesammlung posten sobald es läuft.

MfG
Andreas

von Niki Hammler (Gast)


Lesenswert?

Danke!!!

Jetzt funktionierts, super :-)

Ich habe es bereits in die Codesammlung gestellt

Niki

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.