Stoppuhr

Routinen zum senden und empfangen von Daten über USART (hier anhand vom Mega32)

Code:
int usart_putchar( char c, FILE *stream ){
	if( c == '\n' ) usart_putchar( '\r', stream );
		loop_until_bit_is_set( UCSRA, UDRE );
		UDR = c;
	return 0;
}
int usart_getchar(FILE *stream){
	char c;
	loop_until_bit_is_set(UCSRA, RXC);
	c = UDR;
	/* Echo Ein-/Ausschalten */
	if(c==ENQ){	// Echo Ein/Ausschalten, 0x05 => ENQ
		if(echo==ECHO_OFF){	// ENQ ist Steuerzeichen
			echo=ECHO_ON;
			usart_putchar(c,stdout);
		}else if(echo==ECHO_ON){
			echo=ECHO_OFF;
		}
	}

	if (c == '\r')
		return '\n';
	return c;
}

Wenn du willst kannst du diese Funktionen auch noch mit der Standard Ein- und Ausgabe verbinden (printf bzw scanf):
Code:
static FILE mystdout = FDEV_SETUP_STREAM( usart_putchar, NULL, _FDEV_SETUP_WRITE );
static FILE mystdin = FDEV_SETUP_STREAM( NULL, usart_getchar, _FDEV_SETUP_READ );

Das sind die Variablen dazu, im Initialisierungscode musst du das aber auch noch vermerken:
Code:
void usart_init(void)
{
	UCSRB = (1<<TXEN) | (1<<RXEN); // UART TX und RX einschalten
	UCSRC = (1<<USBS)|(3<<UCSZ0); // 1 stop bit, 8Bit Data
	UBRRL = UBRRL_VALUE;
	stdout = &mystdout;
	stdin = &mystdin;
}

Zum Festlegen der Baudrate:
Code:
#define BAUD 9600 //wird später in setbaud.h verarbeitet und in UBRRH/L_VALUE übergeben
#include <util/setbaud.h>		//vorher muss BAUD definiert sein

Eigentlich bin ich nich der Fan von vorkauen, aber da du schon zwei mal lieb gefragt hast :) BTW: Kann sein das das ganze hier nich so recht zusammen passen will und das du dich vll fragst wo du was hinpackst. Das musst du dir überlegen, ich (musste) dafür eine .c und eine .h schreiben um es später weiterverwerte zu können.

Grüße

PS: Die CODE Blöcke sind echt super :)
Wie gesagt, auf den standard kram kommt man schon mit dem einfachen lesen das Handbuches, da stehen lgaube ich sogar beispiele drin. Sagte ich ja ;)
 
hi zusammen danke für die antwort! ich komme nur nicht ganz draus, wo ich die 6 variablen hineinschreiben muss. zudem der kompiler zickt; er sagt ../7seg.c:33: warning: type of `TIM0_OVF`defaults to `int` , was mach ich falsch? hier der code : (noch ohne uart, soll erst so laufen :D



CodeBox C

#include <avr/io.h>
#define F_CPU 8000000L
#include <util/delay.h>

#define SEGPORT PORTC //Port des 7Seg Elementes
#define ANZPORT PORTD //Port der Anzeige
#define WAIT 5

int sei();

int hunderts1=0;
int hunderts2=0;
int sekunden1=0;
int sekunden2=0;
int minuten1=0;
int minuten2=0;

void initIO()
{

DDRC = 0xff;
DDRD = 0xff;
DDRB = 0x00;
}

void initTimer()
{
TCCR0 |= _BV(CS00) |_BV(CS01); // /64 Prescaler
OCR0=125;
}

void ISR(TIM0_OVF)
{
hunderts1 = hunderts1+1;
if(hunderts1>=10)
{
hunderts1=0;
hunderts2=hunderts2+1;
}
if(hunderts2>=10)
{
hunderts2=0;
sekunden1=sekunden1+1;
}
if(sekunden1>=10)
{
sekunden1=0;
sekunden2=sekunden2+1;
}
if(sekunden2>=6)
{
sekunden2=0;
minuten1=minuten1+1;
}
if(minuten1>=10)
{
minuten1=0;
minuten2=minuten2+1;
}
}
void seg(int s, int v)
{
switch(v)
{
case 1:
SEGPORT=0b00001100;
break;
case 2:
SEGPORT=0b10110110;
break;
case 3:
SEGPORT=0b10011110;
break;
case 4:
SEGPORT=0b11001100;
break;
case 5:
SEGPORT=0b11011010;
break;
case 6:
SEGPORT=0b11111010;
break;
case 7:
SEGPORT=0b00001110;
break;
case 8:
SEGPORT=0b11111110;
break;
case 9:
SEGPORT=0b11011110;
break;
case 0:
SEGPORT=0b01111110;
break;
}
ANZPORT = 1 << s;
}

int main()
{

initIO();
initTimer();

while (1)
{
if ( PINB & (1<<PINB1) ) {
seg(1, hunderts1);
_delay_ms(WAIT);
seg(2, hunderts2);
_delay_ms(WAIT);
seg(3, sekunden1);
_delay_ms(WAIT);
seg(4, sekunden2);
_delay_ms(WAIT);
seg(5, minuten1);
_delay_ms(WAIT);
seg(6, minuten2);
_delay_ms(WAIT);
}

}

}


nochmals danke für die hilfe
 
Hallo Sean,

wenn du den Code-Einfügen Button nutzt, wird dein Code übersichtlicher dargestellt, so dass wir diesen schneller verstehen können. Alternativ kannst duch auch vor dem Code in eckigen Klammern "highligh=C" und danach in eckigen Klammern "/highlight" schreiben, dann wird dein Code farbig und mit Zeilennummern dargestellt, ich habe mir mal erlaubt, deinen obigen Beitrag dahingehend zu editieren ;)

Zu der Compiler-Warnmeldung ...




CodeBox C

#include <avr/interrupt.h> // includiere interrupt.h

// ...

int sei(); // sei() gibt nichts zurück, Zeile entfernen, ist in interrupt.h definiert

// Hinweise zum Timer unten im Beitrag
void initTimer()
{
TCCR0 |= _BV(CS00) |_BV(CS01); // /64 Prescaler
OCR0=125;
}

ISR(TIMER0_OVF_vect) // Benennung des Interruptvektors beim Atmega88
{
// ...
}

int main(void)
{
// ...

return 0x00; // auch wenn main nicht beendet wird, etwas zurückgeben.
}



Zum Timer0:

Du verwendest ja den Atmega88, schau mal in das Datenblatt im Kapitel Timer0/Register Description. Die Register TCCR0 und OCR0 gibt es nicht. Du willst in initTimer() den Timer so initialisieren, dass dieser mit 1/64 fosc läuft, allerdings hat hier das Beschreiben des OutputCompareRegisters OCR mit 125 keine Wirkung. Wenn die Bezeichnungen der Register richtig wären und du den TimerOverflow Interurpt explizit freigegeben hättest, würde zwar ein TimerOverflowInterrupt ausgelöst werden, allerdings läuft der Timer dann über und beginnt von 0.
Du solltest hier den CTC Modus nutzen (Clear Timer on Compare Event). Wird der Comparewert erreicht, wird ein TimerCompareInterrupt ausgelöst (TIMER0_COMP_vect) und der Timer wird automatisch auf 0 zurückgesetzt.

So sieht in etwa die Initialisierung des Timer0 mit CompareEvent aus, musst vielleicht nochmal ins Datenblatt schauen ob das für den Atmega88 stimmt.



CodeBox C

void InitTimer0(void)
{
TIFR0 |= (1<<OCF0A); // Interrupt Request loeschen
TIMSK0 |= (1<<OCIE0A); // Enable Output Compare A Interrupt

OCR0A = 125; // CompareTime anpassen
TCNT0 = 0;
TCCR0A |= 1 << WGM01; // CTC Mode 2
TCCR0B |= (1<<CS01) | (1<<CS00); // 64 prescaler, Timer0 Start
}

ISR(TIMER0_COMPA_vect)
{
// ...
}




Grüße,
Dirk


EDIT: Achso ... in der Routine main() nach initTimer() die Interrupts global freigeben: sei();
Für deine Variablen hunderts1 usw. reicht ein Byte unsigned char bzw. uint8_t.
 
hallo zusammen

komme dem ziel schon näher! noch ein problem: ich habe mir einen kleinen isp programmer (paralleler port) gebaut, weiss aber nicht welche software avr studio braucht, um über parallelport zu kommunizieren. :confused:

danke für die hilfe

sean
 
Hi Sean,

komme dem ziel schon näher! noch ein problem: ich habe mir einen kleinen isp programmer (paralleler port) gebaut, weiss aber nicht welche software avr studio braucht, um über parallelport zu kommunizieren. :confused:
AVR Studio keine ;-) Nimm dafür mal Pony-Prog. Also mit AVR-Studio assemblieren und dann das assemblierte mit PonyProg proggen.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)