Forum: Mikrocontroller und Digitale Elektronik ATtiny8 und GIMSK


von Achim S. (achims)


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

von spess53 (Gast)


Lesenswert?

Hi

>ATtiny 8

Gibt es nicht.

MfG Spess

von Achim S. (achims)


Lesenswert?

Da muss ich mir ein anderen AT oder ATi nehmen und die entsprechenden 
Daten raussuchen.
Einen ATM 8 kenne ich, den Typ auch nicht

von Klaus (Gast)


Lesenswert?

Könnte es sich um einen ATmega8 handeln?

von Max D. (max_d)


Lesenswert?

Wenn ich raten müsste: Beim tippen statt der 9 die 8 erwischt
Ansonsten: Mehr Kontext !

von Achim (Gast)


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

von Kjel (Gast)


Lesenswert?

Achim Seeger schrieb:
>
1
> GIMSK |=(<< PC1...
2
>

Könnte auf einen Port C deuten. Welcher Tiny hat den schon?

von achim (Gast)


Lesenswert?

im ori, glaub ich, steht PB. Muss noch mal nachschauen

von Dieter F. (Gast)


Lesenswert?

ATTINY25/45/85 haben das - aktiviert/deaktiviert den 
PIN-Change-Interrupt

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Achim (Gast)


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

von Thomas E. (thomase)


Lesenswert?

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.

: Bearbeitet durch User
von Achim (Gast)


Lesenswert?

Danke, das hilft sehr viel.
Was nehme ich für PCMSK?

von Thomas E. (thomase)


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.

von Achim (Gast)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Dieter F. (Gast)


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 ...

von Achim S. (achims)


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

von Peter D. (peda)


Lesenswert?

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.

von Dieter F. (Gast)


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.

von Achim S. (achims)


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

von Peter D. (peda)


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.

von Achim (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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.

: Bearbeitet durch User
von Achim (Gast)


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

von Achim (Gast)


Lesenswert?

Sorry, Prescaler nicht angepasst

von Achim S. (achims)


Lesenswert?

Einen Fehler habe ich gefunden

Achim schrieb:

> const char ma[] PROGMEM = „m4,  m1,  m2,  m3“;

Richtig muss es lauten
1
const char * const ma[]={m4, m1, m2, m3};

Damitz kann ich das Programm ohne Problem compielieren.
Leider läuft es immer noch nicht. Sagt garnichts.
Hat jemand noch eine Idee?
achim

von Dieter F. (Gast)


Lesenswert?

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)"

von Achim S. (achims)


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

von Dieter F. (Gast)


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.

von Achim S. (achims)


Lesenswert?

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

von Dieter F. (Gast)


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

von Achim S. (achims)


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

von Dieter F. (Gast)


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)

von Achim S. (achims)


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

von Thomas E. (thomase)


Lesenswert?

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.

von Achim S. (achims)


Lesenswert?

Sorry - ?????

von Thomas E. (thomase)


Lesenswert?

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.

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.