Forum: Mikrocontroller und Digitale Elektronik Programmierproblem


von Toni (Gast)


Lesenswert?

Hallo,
ich bin ein Programmieranfänger.
Ich habe ein Problem mit dem Befehl waitms.
Ich habe folgendes Programm bisher geschrieben:
(Der Microcontroller hat NICHT-Ein-und Ausgänge.)

#include "sfr_r813.h"

long t;

void main(void)
{


pd1 = 0x0F;
pd0 = 0x0 ;



while (1)
    {
if ( p1_6==1 & p1_7==0 )
{
p1_0 = 1;
p1_1 = 1;
p1_2 = 0;
p1_3 = 0;
p0_1 = 1;
waitms (20);
p0_1 = 0;      waitms(1);
}
else
{
p1_0 = 0;
p1_1 = 0;
p1_2 = 0;
p1_3 = 0;
}
}
}

Beim Flashen zeigt es mir folgenden Fehler:

'_waitms' value is undefined

Meine Frage ist, wie ich diese Werte definieren kann?
Wenn mir jemand einen Tipp geben könnte, wäre ich sehr erfreut. :)

MfG Toni

von Turbo T. (turbotoni)


Lesenswert?

Welche Programmiersprache ? Muss das nicht erst mal copiliert werden, 
bevor man das Flashen kann ?

MfG Turbotoni

von coder (Gast)


Lesenswert?

ich vermute, dass die funktion waitms vielleicht nicht bekannt ist

von Matthias K. (matthiask)


Lesenswert?

sieht nach 8051er aus. Welcher Compiler. SDCC? Problem ist wie coder 
sagt. waitms() musst Du selber schreiben.

von Toni (Gast)


Lesenswert?

Das Programm ist in C geschrieben.

Ich glaube, dass ich den Befehl, Funktion oder wie sich das nennt, 
selber schreiben muss.
Ich habe bereits ein solches Tutorial gesucht, aber ich finde nichts.
Es wäre hilfreich, wenn mir es jemand erklärt oder ein Tipp zum selbst 
programmieren geben könnte.

Gruß Toni

von MaWin (Gast)


Lesenswert?

> Ich habe folgendes Programm bisher geschrieben:

Du meinst, du hast abgeschrieben, denn sonst wüsstest du was das waitms 
dort soll.

Es ist ein Funktionsaufruf an eine Funktion, die eben die angegebene 
Anzahl von Millisekunden warten soll.

Die musst du nun selber schreiben, denn niemand weiß, wie schnell dein 
R8C/13 läuft, ob mit 125kHz wie nach dem Einschalten, oder mit 20MHz wie 
nach dem umschalten

   // Bis jetzt laeuft der Prozessor noch mit internem 128kHz durch 8 
Takt
   prc0 = 1;
   cm13 = 1;
   cm15 = 1;
   cm05 = 0;
   cm16 = 0;
   cm17 = 0;
   cm06 = 0;
   asm("nop");
   asm("nop");
   asm("nop");
   asm("nop");
   ocd2 = 0;
   prc0 = 0;
   // Und jetzt laeuft alles mit 20MHz

waitms könnte man bei 20MHz so implementieren:

//*************************************   Wartezeit in Millisekunden
//   wait_ms   (1);                    //    1.1 msec
//   wait_ms  (10);                    //   11.5 msec
//   wait_ms (100);                    //    115 msec
//   wait_ms(1000);                    //    990 msec
void wait_ms(long millisec)            //  warte milli-sec
{
   long z;

   millisec = millisec * 510;
   for( z=0; z<millisec; z++ ) {}      //  ms Zählschleife bei 20MHz
}

bei 125kHz ist die 510 eben eine grössere Zahl,
so 81600 damit es halbwegs passt.


pd0 auf 0 zu setzen und damit die Port-Pins zu Eingängen zu erklären und 
dann Ausgaben an Port 0 zu machen mit
p0_1 = 1;
p0_1 = 0;
ist übrigens witzlos.

von MaWin (Gast)


Lesenswert?

> bei 125kHz ist die 510 eben eine grössere Zahl,
> so 81600 damit es halbwegs passt.

Äh, umgekehrt, dividieren.

von (Ein) (Gast)


Lesenswert?

Toni schrieb:
> if ( p1_6==1 & p1_7==0 )

Das dürfte auch nicht das sein, was du haben möchtest.
ich denke, dass es

if( (p1_6==1) && (p1_7==0) )

sein sollte...

von Toni (Gast)


Lesenswert?

Okay Danke. :)
Ich konnte mittlerweile das Problem beheben.
Vielen Dank für Euere Hilfe. ;)

von Martin (Gast)


Lesenswert?

Toni schrieb:
> Ich konnte mittlerweile das Problem beheben.

Das ist ja schön, läßt du die Nachwelt dran teilhaben?

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.