Forum: Mikrocontroller und Digitale Elektronik PWM Stufenschaltung eines Motors


von Max M. (bytekiller)


Lesenswert?

Hallo,
in einem anderen Thread hatte ich ja gefragt, wie ich die 
Geschwindigkeit eines Motors mit einem Taster regulieren kann. Also ich 
wollte irgendwelche PWM Werte haben und jeder Tastendruck sollte zum 
nächsten Wert wechseln. Dann hat mich jemand auf diesen Thread 
hingewiesen:

Beitrag "Re: EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

Habe dann also den Code übernommen und wollte ihn auf meinen Attiny 
flashen, aber dabei bekam ich folgende Fehler:

Error  5  'PCIE' undeclared (first use in this function)

Error  1  'PCIF' undeclared (first use in this function)

Message  3  each undeclared identifier is reported only once for each
function it appears in C/User....

Message  2  in definition of macro 'BIT'

Message  4  in definition of macro 'BIT'

Message  6  in definition of macro 'BIT'

Kann mir jemand erklären, was diese zwei Fehler und die anderen 
Meldungen bedeuten? Scheinen auf jeden Fall wichtig zu sein, denn wenn 
ich die beiden Zeilen auskommentiere, dann läuft das Ganze nicht. :-D

Und brauche ich in der Schaltung eigentlich zwangsläufig einen 
Kondensator wenn ich ein MOSFET benutze?

von m.n. (Gast)


Lesenswert?

Du meinst diese beiden Zeilen:
  GIFR = BIT(PCIF);                 // flag löschen
  GIMSK |= BIT(PCIE);               // PCINT PORTB zulassen

Dazu muß der richtige µC eingestellt sein, in Deinem Fall also der 
ATtiny2313. Dann sind diese Bits auch bekannt.

von Max M. (bytekiller)


Lesenswert?

m.n. schrieb:
> Du meinst diese beiden Zeilen:
>   GIFR = BIT(PCIF);                 // flag löschen
>   GIMSK |= BIT(PCIE);               // PCINT PORTB zulassen
>
> Dazu muß der richtige µC eingestellt sein, in Deinem Fall also der
> ATtiny2313. Dann sind diese Bits auch bekannt.

Okay, mal eine doofe Frage: Wo finde ich jetzt das, was ich stattdessen 
dort eintragen muss? Die Hilfe vom Atmel Studio bringt nichts und im 
Datenblatt meines Attinys finde ich auch irgendwie nichts.

von Karl H. (kbuchegg)


Lesenswert?

Max Muster schrieb:
> m.n. schrieb:
>> Du meinst diese beiden Zeilen:
>>   GIFR = BIT(PCIF);                 // flag löschen
>>   GIMSK |= BIT(PCIE);               // PCINT PORTB zulassen
>>
>> Dazu muß der richtige µC eingestellt sein, in Deinem Fall also der
>> ATtiny2313. Dann sind diese Bits auch bekannt.
>
> Okay, mal eine doofe Frage: Wo finde ich jetzt das, was ich stattdessen
> dort eintragen muss?

Gar nichts anderes.
Die Bits heissen beim 2313 genau gleich wie beim 25.

Du musst nur bei der Generierung des Projekts im Atmel Studio den 
richtigen Prozessortyp auswählen.

von Max M. (bytekiller)


Angehängte Dateien:

Lesenswert?

> Gar nichts anderes.
> Die Bits heissen beim 2313 genau gleich wie beim 25.
>
> Du musst nur bei der Generierung des Projekts im Atmel Studio den
> richtigen Prozessortyp auswählen.

Habe doch den Richtigen ausgewählt, oder?

von Karl H. (kbuchegg)


Lesenswert?

Welches Studio benutzt du genau?

Hintergrund:

Ich hab den Code mal probehalber in mein (schon älteres) Studio 6 
geworfen.
Und kriegte prompt einen undeclared identifier für GIFR.

Eine Kontrolle im Include File 'iotn2313.h' erbrachte dann, dass GIFR 
jetzt EIFR heisst. Warum auch immer. Im Datenblatt heisst das Register 
immer noch GIFR.

Die Namen 'PCIE' und 'PCIF' existieren aber.

von Max M. (bytekiller)


Lesenswert?

Karl Heinz schrieb:
> Welches Studio benutzt du genau?
>
> Hintergrund:
>
> Ich hab den Code mal probehalber in mein (schon älteres) Studio 6
> geworfen.
> Und kriegte prompt einen undeclared identifier für GIFR.
>
> Eine Kontrolle im Include File 'iotn2313.h' erbrachte dann, dass GIFR
> jetzt EIFR heisst. Warum auch immer. Im Datenblatt heisst das Register
> immer noch GIFR.
>
> Die Namen 'PCIE' und 'PCIF' existieren aber.

Ich benutze das Atmel Studio 6.2.
Also soll ich jetzt GIFR durch EIFR ersetzen?

von Karl H. (kbuchegg)


Lesenswert?

Max Muster schrieb:

> Ich benutze das Atmel Studio 6.2.
> Also soll ich jetzt GIFR durch EIFR ersetzen?

?
Deine Fehlermeldung handelt nicht von GIFR. Deine Fehlermeldung handelt 
von den Namen PCIE und PCIF.

Wie wärs mal mit ein bischen nachdenken und nicht nur hirnlos alles 
übernehmen?

Kommentier die Zeile mal aus, damit das Programm übersetzt wird. Im 
Projektbaum taucht dann unter 'Dependencies' eine Datei 'iotn2313a.h' 
auf. Die kannst du aufmachen und da drinn müsste sich eigentlich PCIE 
und PCIF wiederfinden.

Der entsprechende Abschnitt sieht bei mir so aus
1
....
2
#define OCIE1B 5
3
#define OCIE1A 6
4
#define TOIE1 7
5
6
#define EIFR _SFR_IO8(0x03A)
7
#define PCIF 5
8
#define INTF0 6
9
#define INTF1 7
10
11
#define GIMSK _SFR_IO8(0x03B)
12
#define PCIE 5
13
#define INT0 6
14
#define INT1 7
15
16
#define OCR0B _SFR_IO8(0x03C)
17
#define OCR0_0 0
18
#define OCR0_1 1
19
#define OCR0_2 2
20
#define OCR0_3 3
21
#define OCR0_4 4
22
....

Wenn du in deinem Include File das nicht findest, dann such zb nach 
'GIMSK'. So wie hier, musste dann direkt darunter die Definition für 
'PCIE' zu finden sein.

Wenn du raus hast, was da los ist, korrigierst du den Code entsprechend 
und entfernst die Kommentare wieder, die du gesetzt hast um compilieren 
zu können.

: Bearbeitet durch User
von Max M. (bytekiller)


Lesenswert?

Karl Heinz schrieb:

> Wenn du raus hast, was da los ist, korrigierst du den Code entsprechend
> und entfernst die Kommentare wieder, die du gesetzt hast um compilieren
> zu können.

Das wird wohl noch etwas dauern. Habe den Abschnitt gefunden, aber 
bisher sagt mir das noch gar nichts. :-D

von Karl H. (kbuchegg)


Lesenswert?

Max Muster schrieb:
> Karl Heinz schrieb:
>
>> Wenn du raus hast, was da los ist, korrigierst du den Code entsprechend
>> und entfernst die Kommentare wieder, die du gesetzt hast um compilieren
>> zu können.
>
> Das wird wohl noch etwas dauern. Habe den Abschnitt gefunden, aber
> bisher sagt mir das noch gar nichts. :-D

Und? Wie sieht er aus? Welche Namen werden benutzt?

von Max M. (bytekiller)


Lesenswert?

Karl Heinz schrieb:
> Max Muster schrieb:
>> Das wird wohl noch etwas dauern. Habe den Abschnitt gefunden, aber
>> bisher sagt mir das noch gar nichts. :-D
>
> Und? Wie sieht er aus? Welche Namen werden benutzt?
1
#define EIFR _SFR_IO8(0x03A)
2
#define GIFR _SFR_IO8(0x03A)
3
#define PCIF1 3
4
#define PCIF2 4
5
#define PCIF0 5
6
#define INTF0 6
7
#define INTF1 7
8
9
#define GIMSK _SFR_IO8(0x03B)
10
#define PCIE1 3
11
#define PCIE2 4
12
#define PCIE0 5
13
#define INT0 6
14
#define INT1 7

Ist das der Abschnitt, den du meinst?

von Norbi (Gast)


Lesenswert?

ATtiny2313/V
http://www.atmel.com/images/doc2543.pdf

ATtiny2313A
ATtiny4313
http://www.atmel.com/images/doc8246.pdf

Es gibt Unterschiede zwischen den beiden Datenblättern, eben auch beim 
Interrupt-Flagregister. Beim ATtiny2313A heist es GIFR, beim anderen 
EIFR.

von Max M. (bytekiller)


Lesenswert?

Norbi schrieb:
> ATtiny2313/V
> http://www.atmel.com/images/doc2543.pdf
>
> ATtiny2313A
> ATtiny4313
> http://www.atmel.com/images/doc8246.pdf
>
> Es gibt Unterschiede zwischen den beiden Datenblättern, eben auch beim
> Interrupt-Flagregister. Beim ATtiny2313A heist es GIFR, beim anderen
> EIFR.

GIFR habe ich ja so im Code, aber das geht ja eben nicht. Bzw. was muss 
dann in die Klammern bei GIFR?

von Karl H. (kbuchegg)


Lesenswert?

Max Muster schrieb:
> Norbi schrieb:
>> ATtiny2313/V
>> http://www.atmel.com/images/doc2543.pdf
>>
>> ATtiny2313A
>> ATtiny4313
>> http://www.atmel.com/images/doc8246.pdf
>>
>> Es gibt Unterschiede zwischen den beiden Datenblättern, eben auch beim
>> Interrupt-Flagregister. Beim ATtiny2313A heist es GIFR, beim anderen
>> EIFR.
>
> GIFR habe ich ja so im Code, aber das geht ja eben nicht. Bzw. was muss
> dann in die Klammern bei GIFR?

Nochmal
GIFR ist nicht dein Problem.
Wie man im Ausschnitt (und Datenblatt des Tiny2313A) sehen kann, gibt es 
nicht einfach nur ein PCIE, sondern ein PCIE0 PCIE1 und PCIE2
Auch gibt es nicht wie beim Tiyn2313 ein PCIF, sondern ein PCIF0, PCIF1, 
PCIF2

Aber ehrlich gesagt hab ich jetzt auch keine Lust den Code zu 
analysieren und das Datenblatt zu studieren, welcher Interrupt jetzt für 
den Pin mit dem Taster zuständig ist. Das darf ruhig der 'Taster werden 
per Interrupt abgefragt'-Verfechter tun.

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.