ATtiny8 und GIMSK

OP #3871720
Lesenswert?

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
Gast #3872094
Lesenswert?

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
(Firma: matzetronics) #3872130
Lesenswert?

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.
Gast #3872149
Lesenswert?

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
#3872334
Lesenswert?

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.
Gast #3872651
Lesenswert?

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
Gast #3872751
Lesenswert?

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 ...
OP #3872826
Lesenswert?

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
Gast #3873146
Lesenswert?

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.
OP #3873170
Lesenswert?

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
#3873597
Lesenswert?

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.
Gast #3873668
Lesenswert?

Der Komplette Code:
1
/* ********************************************************************
2
 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.
12
*********************************************************************/
13
#ifndef F_CPU
14
#define F_CPU 16000000UL           
15
#endif
16

17
#include <avr/io.h>
18
#include <util/delay.h>
19
#include <avr/interrupt.h>
20
#include <avr/pgmspace.h>
21
#include <avr/sleep.h>
22

23
// Lautsprecherport
24
#define SPEAKER_DDR    DDRC
25
#define SPEAKER_PORT  PORTC
26
#define SPEAKER      PC7
27

28
// Taster
29
#define TASTER_DDR  DDRC
30
#define TASTER_PORT PORTC
31
#define TASTER_PIN  PC2
32
#define TASTER_INT  PCINT18
33

34
// Vorteiler fuer Timer0 (in ctc_on() TCCR0B entsprechend mit anpassen!)
35
#define PRESCALE 8
36

37
// Tonfrequenzen
38
const uint16_t freq[] PROGMEM = {
39
  //   C,   C#,    D,   D#,    E,    F,   F#,    G,   G#,    A,   A#,    B
40
   262,  277,  294,  311,  330,  349,  370,  392,  415,  440,  466,  494,   // Oktave 5
41
   523,  554,  587,  622,  659,  698,  740,  784,  831,  880,  932,  988,   // Oktave 6
42
  1046, 1109, 1175, 1244, 1328, 1397, 1480, 1568, 1661, 1760, 1865, 1975,  // Oktave 7
43
  2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951 // Oktave 8
44
};
45

46
const char m1[] PROGMEM = "99luv:d=4,o=5,b=180:d6,8e6,c6,e.6,d6,8c6,a.,8p,8a,8f6,f6,f6,f.6,8f6,e6,d6,c.6,d6,8e6,c6,e.6,d6,8c6,a.,8p,8a,f6,f6,f6,f6,8f6,e6,d.6,8c6,8d6,e6,c6,e.6,d6,8c6,a.,8p,8a,c6,8a,c6,f6,f6,e6,d.6,8c6,d6,e6,c6,e.6,d6,8c6,a.,8p,8f6,f6,8f6,f6,f6,f6,e6,2d6";
47

48
const char m2[] PROGMEM = "letitbe:d=4,o=5,b=112:16g.,8g,g,8g,a,8e,8g,g.,8c6,d.6,e6,8e6,e6,8d6,8d6,8c6,2c6,e6,8e6,f6,8e6,8e6,d.6,8e6,8d6,2c6";
49

50
const char m3[] 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";
51

52
const char m4[] PROGMEM = "yday:d=4,o=5,b=125:g,8f,f,p,8a,8b,8c#6,8d6,e6,8p,8f6,e6,8d6,d6,p,8d6,8d6,8c6,8a#,8a,8g,8a#,8a,8a,a,8p,g,f,8a,8g,g,8p,8d,f,8p,8a,a";
53

54
const char ma[] PROGMEM = m4,  m1,  m2,  m3;
55

56
//*********************************************************************
57
ISR(PCINT0_vect)
58
  {
59
    // vorhanden, um MCU definiert aus dem Sleep-Mode zu holen
60
  }
61

62
//*********************************************************************
63
static void ctc_on(void) 
64
  {
65
    // CTC mode mit toggeln von OC0A/OC0B (Tiny85)
66
    TCCR0A |= (1<<COM0A0 | 1<<COM0B0 | 1<<WGM01);
67
    // Prescaler 8
68
    TCCR0B = 1<<CS01;
69
  }
70

71
//*********************************************************************
72
static void ctc_off(void) 
73
  {
74
    TCCR0A = 0;
75
    TCCR0B = 0;
76
  }
77

78
//*********************************************************************
79
int f(int n, int o) 
80
  {  // 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...
81
            // lt. Datenblatt fuer CTC-Mode ist Focnx = Fclk / (2 * Prescale * (1 + OCRnx)
82
            // umgestellt nach OCRnx: OCRnx = (Fclk / Focnx / 2 / Prescale) - 1
83
    return (F_CPU/pgm_read_word(&freq[n+(o-5)*12])/2/PRESCALE)-1;
84
  }
85

86
//**********************************************************************
87
char rf(const char *p) 
88
  {
89
    return pgm_read_byte(p);
90
  }
91

92
//**********************************************************************
93
void my_delay_ms(uint16_t ms) 
94
  {
95
    uint16_t i;
96
    // es ist mir nicht gelungen, die Pause via Timer zu realsieren: es gab merkwuerdige Seiteneffekte, 
97
    // denen ich nicht auf die Spur gekommen bin...
98
    // _delay_ms generiert nur dann wenig Maschinencode, wenn es mit konstanten Werten gefuettert   
99
    // wird, also deshalb dieser Konstrukt....
100
    for (i=0; i<ms; i++) _delay_ms(1);
101
  }
102

103
//**********************************************************************
104
void play(uint8_t i) 
105
  {
106
    const char *p;
107
    uint16_t def_noten_laenge = 4; 
108
    uint8_t def_oktave = 6;
109
    uint16_t def_bpm = 63;
110
    // Anfangspointer setzen
111
    p = (const char*)(pgm_read_word(&(ma[i])));
112
    // Titel ueberspringen
113
    while (rf(p) && rf(p) != ':') p++;
114
    if (!rf(p)) return;
115
    p++;
116
    // als naechstes kommen die Song-Defaults
117
    while (rf(p)) 
118
      {
119
        uint8_t param;
120
        uint16_t value;
121
        // fuehrende Leerzeichen ueberspringen
122
        while (rf(p) == ' ') p++;
123
        if (!rf(p)) return;
124
        // hier ist das Ende des Default-Bereiches erreicht  
125
        if (rf(p) == ':') break;
126
        param = rf(p);
127
        p++;
128
        if (rf(p) != '=') return;
129
        p++;
130
        value = 0;
131
        while (rf(p) >= '0' && rf(p) <= '9') 
132
          {
133
            value = value * 10 + (rf(p) - '0');
134
            p++;
135
          }
136
        switch (param) 
137
          {
138
            //case 'd': def_noten_laenge = 32 / value; break;
139
            case 'd': def_noten_laenge = value; break;
140
            case 'o': def_oktave = value; break;
141
            case 'b': def_bpm = value; break;
142
          }
143
        // folgende Leerzeichen ueberspringen
144
        while (rf(p) == ' ') p++;
145
        if (rf(p) == ',') p++;
146
      }
147
    p++;
148
    // Noten selbst analysieren
149
    while (rf(p)) 
150
      {
151
        uint8_t note = 63;
152
        uint16_t oktave = def_oktave;
153
        uint16_t noten_laenge = def_noten_laenge;
154
        uint16_t dauer_ms;
155
        uint8_t punkt_note = 0;
156

157
        // Leerzeichen ueberspringen
158
        while (rf(p) == ' ') p++;
159
        if (!rf(p)) return;
160

161
        // Notenlaenge bestimmen
162
        if (rf(p) >= '0' && rf(p) <= '9') 
163
          {
164
            uint16_t value = 0;
165
            while (rf(p) >= '0' && rf(p) <= '9') 
166
              {          
167
                value = value * 10 + (rf(p) - '0');
168
                p++;
169
              }
170
            noten_laenge = value;
171
          }
172

173
        // Note bestimmen
174
        switch (rf(p)) 
175
          {
176
            case 0: return;
177
            case 'C': case 'c': note = 0; break;
178
            case 'D': case 'd': note = 2; break;
179
            case 'E': case 'e': note = 4; break;
180
            case 'F': case 'f': note = 5; break;
181
            case 'G': case 'g': note = 7; break;
182
            case 'A': case 'a': note = 9; break;
183
            case 'H': case 'h': note = 11; break;
184
            case 'B': case 'b': note = 11; break;
185
            case 'P': case 'p': note = 63; break;
186
          }
187
        p++;
188
    
189
        // Halbnote hoeher
190
        if (rf(p) == '#') 
191
          {
192
            note++;
193
            p++;
194
          }
195
    
196
        // Halbnote tiefer(?)
197
        if (rf(p) == 'b') 
198
          {
199
            note--;
200
            p++;
201
          }
202

203
          // Punktnote=
204
          if (rf(p) == '.') 
205
            {
206
              // noten_laenge += noten_laenge / 2;
207
              punkt_note = 1;
208
              p++;
209
            }
210

211
          // Oktave ermitteln
212
          if (rf(p) >= '0' && rf(p) <= '9') 
213
            {
214
              oktave = (rf(p) - '0');
215
              p++;
216
            }
217

218
          // hier koennte auch ein Punkt sein...
219
          if (rf(p) == '.') 
220
            {
221
              // noten_laenge += noten_laenge / 2;
222
              punkt_note = 1;
223
              p++;
224
            }
225

226
          // nachfolgende Leerzeichen ueberspringen
227
          while (rf(p) == ' ') p++;
228
          // Komma ist Notentrenner
229
          if (rf(p) == ',') p++;
230
          // Tondauer berechnen (60s = 60000ms)
231
          dauer_ms = (((60000 / def_bpm) * def_noten_laenge) / noten_laenge);
232
          // war eine Punktnote dabei?
233
          if (punkt_note) dauer_ms += dauer_ms/2;
234
          if (note != 63) 
235
            {
236
              OCR0A = f(note, oktave);     // Tonfrequenz einstellen
237
              OCR0B = f(note, oktave);
238
              ctc_on();              // Ton einschalten
239
              my_delay_ms(dauer_ms);      // Ton fuer berechnete Dauer halten
240
              ctc_off();              // Ton ausschalten      
241
            } 
242
          else 
243
            {
244
              // Pause fuer berechnete Dauer
245
              ctc_off();        // Ton ausschalten
246
              my_delay_ms(dauer_ms);
247
            }
248
        }
249
  }
250

251
int main(void) 
252
  {
253
    uint8_t i = 0;
254
    // Taster 
255
    TASTER_PORT &= ~(1 << TASTER_PIN);    // Taster-Pin als Eingang
256
    // PCINT0 initialisieren  
257
//    PCMSK    |=  (1 << TASTER_INT);      // Taster-Pin maskieren
258
//    GIMSK    |=  (1 << PCIE);          // Port Change Interrupt frei
259
PCIR |=(1<<PCIE2);
260
PCMSK2 |=(1<<PCINT18);
261

262
    sei();                        // Interrupts einschalten
263
    // Lautsprecher als Ausgang
264
    SPEAKER_DDR |= (1<<SPEAKER);
265
    while(1) 
266
      {
267
        if (i >= (sizeof(ma)/sizeof(ma[0]))) i = 0;
268
        play(i);
269
        // Sleep-Mode
270
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
271
        sleep_mode();
272
        i++;
273
      }
274
    return 0;
275
  }
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
OP #3874646
Lesenswert?

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
Gast #3874669
Lesenswert?

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.
Gast #3875238
Lesenswert?

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
OP #3875281
Lesenswert?

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
Gast #3875389
Lesenswert?

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)
OP #3875399
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren