Forum: Mikrocontroller und Digitale Elektronik timer interrupt atmega128a


von Wastl F. (rescuetigerchen)


Lesenswert?

Moin!

Wieso habe ich auf PC0 UND PC1 ein Rechtecksignal?
Der Atmega läuft mit 3,6864MHz, erhaltene Impulsdauer momentan 30µs.
Sieht irgendjemand einen Fehler, der auf so ein Verhalten hinweist?
Gruß,
wastlB
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
int main(void)
5
{
6
DDRC |= (1<<PC1)|(1<<PC0);
7
PINC |= (1<<PC1)|(0<<PC0);
8
9
TCCR0 |= (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(0<<COM00)|(0<<CS02)|(0<<CS01)|(1<<CS00);
10
TIMSK |= (1<<OCIE0);
11
TIFR |= (1<<OCF0);
12
OCR0 = 56;
13
sei(); 
14
while(1)
15
{}
16
17
return 0;
18
}
19
20
ISR(TIMER0_COMP_vect)
21
{
22
PORTC ^= ~(1<<PC1);
23
}

von Roland H. (batchman)


Lesenswert?

> PORTC ^= ~(1<<PC1);

Toggle? => ohne "~" ?

Wenn's ein neuer AVR ist, dann besser: PINC = (1 << PC1)

von Wastl F. (rescuetigerchen)


Lesenswert?

Also, ohne "~" toggelt nix, mit "PINC" ist auch Ruhe auf dem Kanal... da 
scheint doch noch was anderes im Busch zu sein?

von Roland H. (batchman)


Lesenswert?

Was ist eigentlich:

> PINC |= (1<<PC1)|(0<<PC0);

Für einen definierten Ausgangswert wäre wohl

PORTC |= ...

besser geeignet.

Mach doch einfach mal ein Toggle mit einer "busy delay" ohne Timer.

von Karl H. (kbuchegg)


Lesenswert?

Die Zeiten stimmen zwar beim Nachrechnen mit dem überein, was sie sein 
sollten. Nichts desto trotz:

Du hast aber schon die M103 Fuse gelöscht?
Ansonsten macht den 128-er beim ersten auftretenden Interrupt einen 
restart.
Was dein beobachtetes Verhalten ganz zwanglos erklären würde.

von Wastl F. (rescuetigerchen)


Lesenswert?

habe jetzt PORTC |=(1<<PC0) stehen, ändert aber leider nichts am 
verhalten.
zur anwendung: ich werde mehrere ventile parallel schalten müssen, 
deshalb kommt nur eine timeranwendung in frage. der restliche code ist 
komplexer (es müssen auch tasten abgefragt werden, ein LCD beschrieben 
werden...) nur der timer macht mir hier eben sorgen.
gibt es irgendwelche Fuses die dafür verantwortlich sein könnten?
die schaltung an sich ist auf einer professionell gefertigten platine 
drauf, kurzschlüsse zwischen den pins habe ich ausgeschlossen 
(multimeter).

von Wastl F. (rescuetigerchen)


Lesenswert?

wenn ich die m103c fuse lösche, so erhalte ich kein rechteck mehr, 
sondern eine steigende flanke rechteck, aber eine abfallende flanke 
sägezahn. die frequenz ändert sich hierbei auch auf etwa 6,6kHz

edit: ich habe allerdings auch OCR0 auf 0xFF gesetzt...

von Krapao (Gast)


Lesenswert?

Lötzinnrest zwischen PC1 und PC0?

Kannst du PC0 und PC1 statisch im Programm unabhängig voneinander 
schalten, indem du PORTC ^= ~(1<<PC1); Anweisungen benutzt?

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.