Forum: Mikrocontroller und Digitale Elektronik Hilfe in CodeVision! RX INTERRUPT


von Schatta (Gast)


Lesenswert?

Hi,

ich benutze codevision um meine programme zu erstellen.

ich habe mit dem wizard eine programmvorlage mit RX INTERRUPT erstellt.
das mit der routine empfangene hole ich mit *strcpy aus dem string des
puffers heraus.

funktioniert soweit ganz gut, nur wie lösch ich nach dem herausholen
der daten aus "rx_buffer" selbigen? habe schon so ziemlich alles
probiert was geht, will einfach nicht funktionieren.

hat das schonmal jemand so gemacht?

freue mich über jede info,
schatta

von Florian Pfanner (Gast)


Lesenswert?

Stell mal deinen Coder als Anhang bereit. So kann ich dir nicht
weiterhelfen. Ich weiß nicht was der CodeVision für einen Code erzeugt.
Ich schreibe solche Routinen immer selber.

Gruß, Florian

von Aleksej (Gast)


Lesenswert?

Code, please...

von Schatta (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

sorry hab ich ganz vergessen...

das ganze soll einen string empfangen, auf lcd ausgeben, ne reziproke
freq-messungung ddurchführen und wieda alles zurück senden...


den rest habe ich glaube ich ausführlich mit kommentaren bestückt...

so far, thomas

p.s. ich weiss, entprellen etc. mit delay verschwendet rechenzeit, aber
die brauch ich eh nich bei der anwendung...

von Peter D. (peda)


Lesenswert?

Na Super, ein C-Wizard, der Assembler einfügt.

Wer soll da denn noch durchsehen.

Nimm lieber WINAVR und schreib Dir der Puffer selber und in C.


Peter

von Schatta (Gast)


Lesenswert?

Hi,

das ist ein Project für die Schule und hier wurden wir beauftragt es
mit CodeVision zu machen....leider fehlt den Lehrern jede
fachkopmpetenz um mir hier weiterzuhelfen.

WinAVR hab ich mal installiert zuhause, hab da aber nicht
durchgeblickt...zudem würde ich mir im Moment nich drüber hinaussehen
soetwas selbst zu schreiben, da ich Neuling auf dem Gebiet der µCs
bin...

mfG,
thomas

von Markus (Gast)


Lesenswert?

Hallo Schatta!

Das macht man am besten so:

void main(void)
{
unsigned char abholen;
..

while(1)
 {
  if(rx_counter!=0)
   {
    abholen=getchar();
   }
 }

Das heisst die Daten werden in der IRQ-Routine in den Buffer gestellt.
Das Hauptprogramm fragt den rx_counter ab, ob sich etwas im Buffer
befindet. Befindet sich etwas im Buffer, so holt man das Zeichen
einfach mit getchar ab. Die Funktion Getchar regelt das mit dem
Buffer.

@Peter
Es wäre ziemlich dumm das Ganze unter C zu programmieren, da das Ganze
vom Compiler-Hersteller auf Geschwindigkeit optimiert ist. Mit #pragma
savreg(+,-) kann man das Sichern der Register in den Einsprung in die
IRQ-Routine ein und abschalten. Durch das Abschalten muss nacher mit
Assembler weitergemacht werden, da sonst irgendwelche wichtigen
Register überschrieben werden würden.
Ab und zu muss man auch auf andere Programmierer vertrauen und die
Kontrolle loslassen.
Ich habe diese ganze IRQ-Steuerung mit Senden und Empfangen mal richtig
durchgetestet und sie funktioniert großartig.

Tschüss

Markus

von Schatta (Gast)


Lesenswert?

Hi,

danke für den tip!

ich habe es in leicht abgeänderter form in mein programm eingebaut!

jetzt bleibt nur noch zu hoffen dass es auch klappt! betentu

kanns leider erst morgen testen, werd euch dann aber berichten!

so far,
schatta

von ape (Gast)


Lesenswert?

eigentlich muss man bei codevision gar nichts mehr tun wenn er die
funktionen eingefügt hat...

einfach nur


char c;
...
while(1) {
    c = getchar();
}

rx_counter wird schon in getchar abgefragt, also soll heißen er geht da
in ne endlosschleife, bis daten eintreffen.

von Peter D. (peda)


Lesenswert?

@Markus

"Es wäre ziemlich dumm das Ganze unter C zu programmieren, da das
Ganze
vom Compiler-Hersteller auf Geschwindigkeit optimiert ist."


Nein wäre es nicht.
Selbst mit kleinstem Vorteiler sind satte 160 Zyklen zwischen den Bytes
und das reicht bequem, um auch in C ein Byte in einen Puffer zu
schreiben.


Ich würde ich daher nie so einen Wizard einsetzen, da ich mehrere
verschiedene MCs verwende und deshalb den Code möglichst portabel
halten will.



Peter

von Markus (Gast)


Lesenswert?

@ape
rx_counter wird schon in getchar abgefragt, also soll heißen er geht
da
in ne endlosschleife, bis daten eintreffen.

Ja. Dann kann aber das Hauptprogramm nichts mehr machen, da die
Funktion wartet bis ein Zeichen eingetroffen ist. Besser ist es meines
erachtens nach, wenn man erst dann das Getchar abfragt, wenn auch
wirklich ein Zeichen im Buffer steht.
  if(rx_counter!=0)
   {
    abholen=getchar();
   }

@Peter
Das mit der Portierbarkeit ist natürlich immer ein Argument. So gesehen
hast du recht.

Tschüss

Markus

von ape (Gast)


Lesenswert?

Ja. Dann kann aber das Hauptprogramm nichts mehr machen

ja das ist meistens so bei endlosschleifen :)

hatte jetzt noch in erinnerung, das schatta meinte rechenzeit wäre egal
und wenn sein programm irgendwas mit dem string tun soll hat es eh
nichts weiter zu tun als auf den string zu warten.

von Schatta (Gast)


Lesenswert?

Hi,

also erstmal sorry wenn ich den beitrag nochmals hochhole, falls dies
hier nicht gewünscht ist!

nach etlichen weiteren versuchen und nachdem wieder nichts klappte
schrieb ich dann den leuten von codevision.
mein kompliment an diese firma, innerhalb von 3stunden war eine antwort
im postkasten, die wie folgt lautete:

AUSZUG:

....

You must use getchar() to retrieve characters from the buffer:

char received_text[32];

int receive_string (char *p) {
int received_chars=0;
while (rx_counter) {
        *p=getchar();
        ++p;
        ++received_chars;
        };
*p=0; // null terminate the received string
return received_chars;
}

main() {
receive_string(received_text);
}
........

erstmal blickte ich ganz schockiert als anfänger auf diese antwort aber
nach kleinen modifikationen funktionierte es auf anhieb.
wie es hier scheint ist rx_counter keine zahl die hochzähltt sondern
nur 1 oder 0.....denk ich mir mal (bitte um korrektur falls nötig)
da ich die anzahl der chars nich brauchte baute ich das ganze um:

void get_data (char *p)
//uebernimmt Daten aus dem Puffer
{
  while (rx_counter)
    {
    *p=getchar();
    ++p;
    };
  *p=0;
}

in dieser konstellation funktioniert es wunderbar, aber fragt mich
bitte nicht warum ;)

ich dachte ich hol das ganze nochmals hoch, da vielleicht doch den
einen oder anderen interessiert.....und dass derjenige nich die selbe
zeit investieren muss wie ich!

auch nochmal danke an alle die mir im beitrag geholfen haben.

mfG,
schatta

p.s.:weiss jemand wos grundlagen zur reziproken frequenzmessung gibt?
hab bis jetzt im web nur 1 beispiel gefunden...im forum hier is auch
kein beispiel oder bin ich blind

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.