PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 60 Sekunden berechnen in C+ RN-Control 1.4



tomschmied
22.03.2010, 09:57
Hallo,

kann mir jemand ein Programm in C+ geben,
wie ich 60 Sec. abfragen kann?

Ein Schrittmotor soll sich exakt jede Minute einmal bewegen.
Die Motoransteuerung funktioniert bereits.

Gruß

Tom

Del
22.03.2010, 10:13
Hi

Du erstellst einfach einen Timer der eine Variable hochzählt, hat die Variable einen bestimmten Wert erzeugt sind 60Sekunden rum.
Beispiele findest du hier: https://www.roboternetz.de/wissen

tomschmied
22.03.2010, 10:17
Das aus WIKI hab ich eingebaut. Aber wie schon da steht stimmt die Zeit nicht. Was mus da geändert werden?




/*Die Funktion lässt circa so viele Millisekunden verstreichen, wie angegeben werden.
Angepasst auf das RN-Control 1.4 mit 16 MHz-Quarz!
Vorsicht, Wert ist nur experimentell angenähert, nicht exakt berechnet!*/

void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
uint16_t __c = 4000;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}

021aet04
22.03.2010, 10:39
Du arbeitest mit wait. Besser und genauer ist es, wenn man einen Timer konfiguriert und diesen Timer eine Variable hochzählt. Wenn die Zeit verstrichen ist Variable auf 0 setzen und den Motor drehen lassen. (Stichwort Timerinterrupt). Welchen µC verwendest du?

//Deine Headerdateien einfügen
#include <util/delay.h>
#include <avr/interrupt.h>


unsigned char sreg_save;
volatile unsigned char i=0;

//Timerinterrupt
ISR(TIMER0_OVF_vect)
{
sreg_save=SREG; //Register sichern
i++; //Variable erhöhen
SREG=sreg_save; //Gesichertes Register wieder zurückschreiben
}
//Hauptschleife
int main(void)
{
//Ausgang konfigurieren (musst du anpassen)
DDRB = 0xff;

PORTB = 0x00;

//Timer konfigurieren (musst du noch anpassen => Datenblatt lesen)
TCCR0B |= (1<<CS00) | (1<<CS02);
TIMSK |= (1<<TOIE0);

//Interruptfreigabe
sei();

while(1)
{
// Hier kommt dein Programm her
}

}