Hallo Gemeinde
in einem Code wird der ATtiny 8 angegeben.
Dabei wird das Stück Code
1
PCMSK|=(1<<Taster..
2
GIMSK|=(<<PC1...
verwendet.
Wollte das verwendete Register aus dem Datenblatt raussuchen und ändern.
Leider konnte ich nichts dazu finden. Ab ATtiny 10 kein Problem, da gibt
es genug. Hab ich da was übersehen oder ist die Angabe in der Anmerkung
falsch?
Es soll auf einem AT1284p laufen. Wenn ich es richtig sehe, sind es
Interrupt Register.
achim
Hallo Max
da ist leider nicht viel drin. In der Erklärung zu dem Code schnipzel
ist vim ATtiny 8 die Rede. Es stammt alles aus 2009. Hatte angenommen,
das es ein abgekündigter (veraltert) ist. Habe im netz nichts gefunden,
ausser den ATy 20,40,80 usw. Geht dabei ja nur um die beiden
Anweisungen. Nehme mit ein vergleich vor z.B. den 84 oder so und werde
vergleichen. Die Anweisung gibts noch, nennt sich jetzt nur anders.
achim
Dieter Frohnapfel schrieb:> ATTINY25/45/85 haben das - aktiviert/deaktiviert den> PIN-Change-Interrupt
Jaja, das ist schon klar. Der TE redet aber von einem ATTiny8! Nahezu
alle modernen AVR haben GIMSK, das ist nicht das Problem. Aber eben
nicht die Winzlinge wie ATTiny4/5/9/10. Und da gibt es sowieso keinen
Tiny8. Die kleinen Kerlchen haben auch keinen Port C, sondern nur
Stückchen von Port B.
Nehme mal an, das die 5 vom 85 "vergessen" wurde. So weit klar.
Bin im Datenblatt vom 1284p und suche den vergleich. Dieser ist zwar
viel zu gross, macht sich bestimmt sehr gut als RTTTL Player bei
Multitasking
achim
Achim Seeger schrieb:> GIMSK |=(<< PC1...
Wenn das irgendeinen Sinn machen soll, heisst das richtig und
vollständig
1
GIMSK|=(1<<PCIE);
und ist somit die Freigabe des Pinchange-Interrupt.
Achim schrieb:> Bin im Datenblatt vom 1284p und suche den vergleich.
Bei den Atmegas werden die Pinchange Interrupts im PCICR freigegeben.
mfg.
Achim schrieb:> Was nehme ich für PCMSK?
Erstmal suchst du dir einen Pin aus. Nehmen wir PD3.
Im Pinout sieht man, dass PD3 den PCINT27 hat. Diesen PCINT27 findest du
in einem der PCMSK-Register wieder. Damit setzt du die Pinmaske:
1
PCMSK3=(1<<PCINT27);
Dann musst du noch gucken, welcher PCIE zu PCMSK3 gehört. Trivialerweise
ist das PCIE3. Also muss man nicht wirklich nachsehen.
mfg.
So, habe fleissig gelesen und hoffe auch einiges verstanden zu haben.
Versuche mal ein Beispiel zu machen.
Wenn ich so sehen, gehen nicht alle Pins für Interrupt. Mit so einem Pin
kann ich einen Interrupt Eingang schalten. Dadurch löse ich den
Interrupt aus.
Beispiel:
AT1284p, PC 7, PCINT 23, PCMSK 2, kein PCPCIE
Beispiel:
AT1284p, PC 2, PCINT 18, PCMSK 2, PCIE 2
PCICR |=(1<<PCIE2);
PCMSK2 |=(1<<PCINT18);
Gehe da von aus, das PC 7 keinen Interrupt auslösen kann.
Der PC 2 kann das. Mit dieser Einstellung sage ich dem AT das der Taster
am PC2 einen Interrupt auslöst.
Wie sage ich das, ob er steigenden oder fallender Flanke auslöst?
Alles Mist?
achim
Achim schrieb:> Wie sage ich das, ob er steigenden oder fallender Flanke auslöst?
Das geht bei den Pinchange Interrupts nicht. Die lösen bei jedem
'Pinchange', also Polaritätswechsel aus.
Achim schrieb:> Gehe da von aus, das PC 7 keinen Interrupt auslösen kann.
Dann gehst Du von einer falschen Annahme aus:
12.3.3 Alternate Functions of Port C
Table 12-9. Port C Pins Alternate Functions
Port Pin Alternate Function
PC7
TOSC2 (Timer Oscillator pin 2)
PCINT23 (Pin Change Interrupt 23)
PC6
TOSC1 (Timer Oscillator pin 1)
PCINT22 (Pin Change Interrupt 22)
PC5
TDI (JTAG Test Data Input)
PCINT21 (Pin Change Interrupt 21)
PC4
TDO (JTAG Test Data Output)
PCINT20 (Pin Change Interrupt 20)
PC3
TMS (JTAG Test Mode Select)
PCINT19 (Pin Change Interrupt 19)
PC2
TCK (JTAG Test Clock)
PCINT18 (Pin Change Interrupt 18)
PC1
SDA (2-wire Serial Bus Data Input/Output Line)
PCINT17 (Pin Change Interrupt 17)
PC0
SCL (2-wire Serial Bus Clock Line)
PCINT16 (Pin Change Interrupt 16)
Alle Pins von Port C können das ...
Hallo Dieter
bin da von ausgegangen, wenn kein PCIE geht auch kein Interrupt geht.
Das hatte ich dabei nicht berücksichtigt bzw. bin noch nicht so weit
gekommen. Freue mich mehr, wenn das obere von mir stimmt. Da ja kein
Wiederspruch kommt, nehme ich an, das es stimmt.
Polaritätswechsel, ok
PC0 und PC1 verwende ich bereits als SCL/SDA. An den nächsten 3 liegen
Taster bei mir. JTAG müsste ausgeschaltet sein.
Wie mach ich das ohne PCIE?
achim
Achim schrieb:> Mit dieser Einstellung sage ich dem AT das der Taster> am PC2 einen Interrupt auslöst.
Aber nicht nur einen, sondern viele.
Daher nimmt man üblicher Weise den Timerinterrupt zum Tasten einlesen
und entprellen.
Achim Seeger schrieb:> bin da von ausgegangen, wenn kein PCIE geht auch kein Interrupt geht.
Wie kommst Du darauf, dass es für PC7 kein PCIE.. gibt? Es ist der
gleiche wie für PC2. Der Interrupt wird immer für eine Gruppe von Pins
aktiviert, welche Du im Einzelnen mit der Maskierung (PCMSK..) genau
definierst.
Im Interrupt-Handling musst Du dann halt schauen, welcher von Deinen
definierten Pins den Interrupt ausgelöst hat.
Peter Dannegger spielt auf seine super-duper (wirklich!)
Tasten-Entprell-Routine an. Wenn Du mit Tasten arbeiten willst solltest
Du Dir das mal anschauen:
http://www.mikrocontroller.net/articles/Entprellung
Es dauert zwar ein Weilchen (bei mir zumindest) bis man begreift, was da
passiert, aber es lohnt sich :-)
Die Pinchange-Interrupts sind für das Auslesen von Tasten nicht
besonders geeignet, weil Du dann das Prellen beim Drücken und das
Loslassen mit Prellen im Interrupt bearbeiten / unterdrücken musst.
Würde ich nicht machen.
Hallo Dieter
habe in deas Datenblatt vom AT1284p geschaut. In der Tabelle stehen die
Werte drin. Für den einen war kein Wert angegeben. Daraus habe ich
gefogert (leider falsch) das dazu keinen gibt. Die Entprellung von Peter
benutze ich bereits in mehreren Sachen und bin sehr zufrieden damit.
Meine Frage bezog sich eigentlich auf die änderunge die ich am Code für
RTTTL Player vorgenommen habe. Steht vor ca 2 Stunden drin. Der lässt
sich ohne Fehler compielieren aber läuft nicht. Ein paar Sachen habe ich
schon gefunden. Bleibe aber am Interupt hängen und komme nicht weiter.
Verstehe es leider nicht
achim
Achim Seeger schrieb:> Dabei wird das Stück Code> PCMSK |=(1<< Taster ..> GIMSK |=(<< PC1...> verwendet.Achim Seeger schrieb:> Der lässt> sich ohne Fehler compielieren aber läuft nicht.
Im einfachsten Fall zeigt man einfach den original Code und die
Änderungen.
Dann müssen wir hier nicht im Nebel stochern und blöd rumraten.
Code beschreibt sich nunmal schlecht in aus dem Kontext gerissenen
einzelnen syntaktisch falschen Zeilen.
Code immer als Copy&Paste oder als Anhang.
Und wenn es um ATtiny85 und ATmega1284P geht, dann schreibs auch so.
Bei Fantasiecode und Fantasiebezeichnungen können wir nicht helfen.
Hallo Peter
habe den gesamten Code in einen anderen Tread gestellt. Nennt sich RTTTL
Player. Ist alles drin. Kann Ihn auch gern hier reinstellen.
achim
Achim schrieb:> habe den gesamten Code in einen anderen Tread gestellt.
Dann editiere Dein Eröffnungspost und füge den Link zu dem
Original-Thread hinzu.
Und begründe, warum Du zu einem Thema einen weiteren Thread erstellt
hast.
Niemand kann sämtliche Threads im Forum kennen.
Melodiegenerator fuer AT 1284p (ATtiny85) Uwe Berger; 2009
3
Inputformat der Melodien ist Nokias RTTTL-Format. Der Rest ist aus dem Quelltext ersichtlich!
4
Wobei im vorliegenden Programm aber der RTTTL-Parser gleich mit drin ist und somit ohne externen
5
Konverter auskommt. Man kann RTTTL-Klingeltoene ohne Anpassung an der entsprechenden Stelle im
6
Programm eingefuegt werden
7
* Nachteil: es wird etwas mehr Speicherplatz fuer das Programm verbraucht
8
* Hardware:
9
- an PC7 ist ein Lautsprecher angeschlossen. Ich habe dazu eine dieser laermenden Geburtstagskarten
10
gepluendert. Dieser Lautsprecher wurde direkt angeschlossen, eventuell sollten aber bei anderen Modellen Strombegrenzungswiderstaende vorgesehen werden.
11
- an PC2 ist ein Taster angeschlossen, der den Tiny aus dem Schlaf reisst und ihn die naechste Melodie dudeln laesst. Der geschlossene Taster legt GND an den Pin, es sollte ein PullUp-Widerstand von 10kOhm vorgesehen werden.
constcharm3[]PROGMEM="Peter Schilling - Major Tom:d=4,o=6,b=200:c.,8p,c,c,c.,8p,c.,8p,2a5,2c,c,8a#5,8a5,g.5,8p,2a#5,2d,2d,c.,8p,2a5,2c,c,8a#5,8a5,g.5,8p,2a#5,2d,2d,e.,8p,1f,2e,d,c,2d.,c,2d,e.,8p,1f,2e,d,c,2d.,c,2d,2";
{// lustiger Nebeneffekt des Zugriffs auf den Flash-RAM: die Zeit die dazu notwendig ist, fuegt // eine kleine Pause zwischen den Toenen ein, die auch ganz sinnvoll ist...
Die erste Frage bezog nur auf den geänderten Code bzw. den anderen
Prozessor. Sorry. Dieser Code lässt sich komplett im AVR Studio
compilieren, ohne Fehler, lüft aber nicht.
Hadrware, AT1284p, 16MHz, Taster PC2, Piezo Lsp PC7
achim
An PC7 wirst Du nie was hören - setze den Speaker mal auf PB4 ...
Schräg wird es sowieso werden, da Du mit einer anderen Grundfrequenz
arbeitest.
Das Original war übrigens wirklich ein ATTiny85:
Beitrag "noch ein Melodiegenerator (RTTTL-Format)"
Hallo Dieter
hatte den ori Beitrag auch wiedergefunden. Hatte sich in den tiefen
meiner Festplatte versteckt. Den Prescaler habe ich auch angepast. Da
ich einen anderen Prz und Board verwende liegt der Speaker bei mir auf
der PC7. Muss ich dann auf PB4 setzen?
Das ori arbeitet mit 1MHz und Teilung 8, müsste 125k ergeben
achim
Achim Seeger schrieb:> Da> ich einen anderen Prz und Board verwende liegt der Speaker bei mir auf> der PC7. Muss ich dann auf PB4 setzen?
Do toggelst OC0A/OC0B für die Ton-Ausgabe - und die liegen nun mal nicht
auf PC7 sondern auf PB3 und PB4 - egal, was Du über "SPEAKER.."
festlegst.
Im Original hängt der Lautsprecher an OC0B - wäre in Deinem Fall PB4.
Also:
// Lautsprecherport
#define SPEAKER_DDR DDRB
#define SPEAKER_PORT PORTB
#define SPEAKER PB4
Achim Seeger schrieb:> Das ori arbeitet mit 1MHz und Teilung 8, müsste 125k ergeben
Ja, heisst bei Dir: Prescaler 128 bei 16 MHz ... , falls ich richtig
rechne.
Hallo Dieter
sorry, komme gerade von Arbeit. Leider hatte ich lange vorher den
Lautsprecher auf C7 festgelegt, Hatte damals noch garnicht an diese
Sache gedacht. An den Port A Pin 0 bis 7 komme ich gut ran, muss mir
zwar was einfallen lassen wie ich es mache.
achim
Hallo Achim,
Achim Seeger schrieb:> An den Port A Pin 0 bis 7 komme ich gut ran,
wieso schreibst Du "Port A"?
"Port B" ist Dein Ziel ... :-)
Achim Seeger schrieb:
> Hallo Jürgen> es könnte sein das der verwendete PC7 gar nicht für sowas geht. Mal> sehen was ich an der Hardware schnell machen kann.
Es kann nicht nur sein - es ist so ... (Du solltest Dich für einen
Thread entscheinen ...)
Gruß
Dieter
Hallo Dieter
beim Aufbau der Hardware habe ich zufällig den Port C für Taster, LED,
I2C bus und Lautsprecher benutzt. Hatte sich vom Aufbau so angeboten.
Auf dem kleinen Board was ich habe sind auf der linken Seite der Port B
und D, dazwischen ist der AT1284p und auf der rechten Seite Port A
(oben) und Port C (unten).Die dei Ports sind auf Wannenstecker 2x5
gelegt und nach aussen geführt. Nur der Port C bleibt für die Bedienung
und Anschluss des Bus ohne Wannenstecker. Im ori ist der PB(?) benutzt.
Hatte angenommen das es einafch auf den Port C7 legen kann. Ist ja nun
nicht so. Direkt oberhalb des Lautsprechers befindet sich der Port A mit
dem Wannenstecker und kann zum Anschluss von Platinen genutzt werden.
Vielleicht kann was am Port A angeschlossen werden.
achim
Achim Seeger schrieb:> Vielleicht kann was am Port A angeschlossen werden.
Hallo Achim,
Du kannst alles mögliche an Port A, C und D anschliessen - OC0A und OC0B
sind aber nur an Port B verfügbar.
Also nochmal:
12.3.2 Alternate Functions of Port B
The Port B pins with alternate functions are shown in Table 12-6.
The alternate pin configuration is as follows:
...
PB4
SS (SPI Slave Select input)
OC0B (Timer/Conter 0 Output Compare Match B Output)
PCINT12 (Pin Change Interrupt 12)
...
PB3
AIN1 (Analog Comparator Negative Input)
OC0A (Timer/Conter 0 Output Compare Match A Output)
PCINT11 (Pin Change Interrupt 11)
...
Wenn Du die Timer zur Tonerzeugung mit Toggeln des Ausgangs nutzen
willst (wie im Original), dann führt bei dem AT1284p kein Weg an Port B
vorbei. (Punkt)
Danke Dieter für deinen Punkt. Bin schon am denken und teilweise suchen.
Bisher habe ich (noch vor) ein Graphikdisplay am Port B und D
anzuschliessen. Muss mal die notwendigen Anschlüsse zählen. Brauch
wahrscheinlich nicht alle. Damit kann ich einen Lsp auf einen Port B
hängen.
Was ist dann am besten, wieder einen Piezo Lsp oder normalen Lsp?
Verstärkung über OPV und Filter? So wie beim Nibo?
Bin wieder ganz schön neugierig
achim
Dieter Frohnapfel schrieb:> Wenn Du die Timer zur Tonerzeugung mit Toggeln des Ausgangs nutzen> willst (wie im Original), dann führt bei dem AT1284p kein Weg an Port B> vorbei. (Punkt)
Mit Timer2 könnte man PD6 und PD7 verwenden.
mfg.
Achim Seeger schrieb:> Sorry - ?????
Das, was der Timer0 macht, kann auch der Timer2 machen. Dessen Ausgänge
sind PD6 und PD7. Vielleicht kommst damit mit deiner Schaltung besser
klar.
mfg.