www.mikrocontroller.net

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


Autor: Niki Hammler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Niki Hammler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!!!

Jetzt funktionierts, super :-)

Ich habe es bereits in die Codesammlung gestellt

Niki

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.