Forum: Mikrocontroller und Digitale Elektronik Hilfe gesucht


von Mike (Gast)


Lesenswert?

Hallo zusammen

bin mal wieder auf dieser seite, weil mein code spukt...

habe folgendes problem:
Prozessor MSP430F149

ich habe eine kleine timer routine programiert....

void ventil_oeffnen (unsigned int soll_oeffnungszeit)
{
TBCTL = 0x0144;       //Timer konfigurieren
TBCCTL0 = 0x0010;     //Timer Interrupt enable
TBCCR0 = 36863;
TBCTL |= 0x0050;      //Timer start


do
  {
  P2OUT|=0x80;                  //Ventil öffnen bis Zeit abgelaufen
ist

  }while (ist_oeffnungszeit<soll_oeffnungszeit); //Wert der hier
eingesetzt wird entspricht der anz. 1/100s
lcd_dispint(1,ist_oeffnungszeit);
P2OUT&=0x7F;                   //Ventil wieder schliessen wenn Zeit
abgelaufen
ist_oeffnungszeit=0;
TBCTL&=0xFFCF;                 //Timer stopen
TBCCTL0&=0x0000;               //Timerinterrupt disable

}

dazu die passende interrupt routine...

#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B (void)
{
  ist_oeffnungszeit++;
}


als globale variabel wird
volatile unsigned int ist_oeffnungszeit=0;
verwendet

nun mein problem. wenn ich den funktionsaufruf
ventil_oeffnen (1000);
schreibe, heisst das, dass das ventil welches ich ansteuere 10s offen
ist da ich den timer so konfiguriert habe, dass er alle 1/100s einen
interrupt auslöst und die variabel "ist_oeffnungszeit" um eins
erhöht.
doch leider bleibt das ventil aus unerklärlichen gründen sehr lange
offen wenn ich "ventil_oeffnen (1);"schreibe. hier sollte das ventil
ja nur 1e hundertstellsekunde offen bleiben.

da ich dem timer nicht getraut habe, machte ich folgendes

TBCTL = 0x0144;       //Timer konfigurieren
TBCCTL0 = 0x0010;     //Timer Interrupt enable
TBCCR0 = 36863;
TBCTL |= 0x0050;      //Timer start

do
{
 P1OUT|=0x80;

}while(ist_oeffnungszeit<100);
P1OUT&=0x7F;


diese funktion macht einen 1s langen impuls an P1.7
ich habe dies mit dem KO überprüft und es stimmte. der timer arbeitet
also ok??

Hat jemand eine ahnung bei diesem problem

danke für eure hilfe

von Sebastian (Gast)


Lesenswert?

1) Klappen denn andere Zeiten (10 Hundertstelsek., 20, 30, 100 usw.)
einwandfrei?

2) Welche Taktfrequenz hast du? Externer 32kHz oder DCO?

von Mike (Gast)


Lesenswert?

ja, die anderen zeiten klappen so lala. wenn ich zum beispiel 300
eingebe und parallel mit der stoppuhr stoppe, sind es mehr als 4s
obwohl es nur 3 sein sollten.
ich glaube irgendwo verzögert sich das ganze...

ich habe einen externen 7,3728MHz Quarz...

von Sebastian (Gast)


Lesenswert?

Wie kommst du denn auf diesen krummen Wert? Ist das ein USART-Teiler?
grübel Läuft der Oszillator denn korrekt? BSCTL-Bits geprüft und
gewartet, bis er stabil ist?

von Mike (Gast)


Lesenswert?

jaja, alles ok, sonst laufen die timergeschichte super....
habe einfach gerade ein solchen quarz gehabt, darum der krumme wert....

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.