PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8-16pu Programmierproblem



StevB
31.08.2007, 08:53
Hallo,

ich möchte euch mal um Hilfe bitten.
Ich habe einen Atmega8-16pu, welcher mit 9,6 MHz getaktet ist.
Nun wollte ich als Test 8 Leds nach einander im Zeitinterval von 1s schalten.
Naja dies funktioniert nicht so richtig.
Wenn ich einen Vorteiler von 1024 benutze , würd die schaltung sehr langsam.
Wenn ich aber nur einen Teiler von 64 benutze, funktioniert es so etwa genau.

(edit: mit 64 funtkioniert auch nur so langsam... :-( )

#include <avr/io.h>
#include <io.h>
#include <util/delay.h>

int ATRoutine(void);


/*int ATTimer16(unsigned char ucStart);
int ATTimer8();
int ATInput(unsigned char ucPortnumber, unsigned char ucIO);
int ATOutPut
*/

int ATRoutine(void)
{
unsigned char i = 0;
unsigned int t = 0;
unsigned char ucLumiMAX = 0;



TCCR0 = (1<<CS02)+(1<<CS00);
//TIFR |= (1<<TOV0);
//TIMSK |= (1<<TOIE0);

while(1)
{

if(TIFR & (1<<TOV0)) //* TimerOverflow
{
TIFR |= (1<<TOV0);
t++;
}

if(t == 37)
{
t=0;
PORTD = (1<<i);

if(i == 7)
{
ucLumiMAX = 1;
}

if(i == 0)
{
ucLumiMAX = 0;
}

if(ucLumiMAX)
{
i--;
}
else
{
i++;
}
}
}

return 1;
}

int ATInitIO(void)
{
//* Ausgaenge
DDRD = 0xff;
PORTD = 0x00;

//* Eingaenge
DDRB = 0x00;
PORTB = 0x00;

return 1;
}

int main(void)
{
/* if(ATInitIO())
if(!ATRoutine())
{
//* Fehlermeldung wenns Zyklus fehlerhaft war
}
else
{
//* Fehlermeldung wenns Init fehlerhaft war
}*/
TCCR0 = 0x05;
ATInitIO();
ATRoutine();

return 0;
}

pongi
31.08.2007, 14:34
Ich verstehe dein Problem nicht so ganz...

Hast du die Taktfrequenz im Program per #define F_CPU hinterlegt?

izaseba
31.08.2007, 16:18
Schon mal was von Code einrücken gehört ?
Das kann doch kein Mensch lesen :-$
An F_CPU wird es wohl nicht liegen, weil er zwar die delay.h includet, aber nirgendwo nutzt (es sei denn ich bin blind)
Ich denke mal, daß der µC mit internem Takt läuft...
A ja,


TIFR |= (1<<TOV0);
das ist falsch, es muß


TIFR = (1<<TOV0);
heißen.
Gruß Sebastian

StevB
01.09.2007, 11:44
Also das mit dem Einrücken liegt am Copy-Vorgang.
Die F_CPU ist in der MAKEFILE mit eingebunden und wird über avrdude als Parameter an den Baustein geschickt.

Ich selber geh aber auch davon aus das der immer auf internen standard takt läuft.
Weil mit 1MHz und der ganzen Umrechnerei dazu sieht es funktionstüchtig aus.

Danke für den Fund des Fehlers bei dem Bitoperator. Dürfte aber der Compiler ausgebessert haben, sprich kein semantischer Fehler. Zumindest ging es so auch irgendwie.

Gruß Stev

BASTIUniversal
01.09.2007, 16:21
Hi!
Ich hab euch mal ins richtige Forum verschoben.

MfG
Basti

fluchtpunkt
01.09.2007, 19:05
Also das mit dem Einrücken liegt am Copy-Vorgang.


Schreib deinen Code zwischen
und

Reeper
01.09.2007, 19:45
Also das mit dem Einrücken liegt am Copy-Vorgang.


Schreib deinen Code zwischen
und

Aber ich muss sagen, dass es dadurch auch nicht immer korrekt eingeschoben wird.
Erst wenn man den Text zB. in WINAVR kopiert, wird dieser richtig angezeigt...

Liegt das an meinen Browser oder ist das normal?

Gruß
Stefan

fluchtpunkt
02.09.2007, 08:37
liegt sicher teilweise daran das verschiedene Editoren Tabs anders interpretieren.
Bei manchen entspricht ein Tab 4 Leerzeichen, manchmal 8, manchmal werden die Tabs komplett durch Leerzeichen ersetzt und so weiter

Schaetz ich mal :)