Forum: Mikrocontroller und Digitale Elektronik Arduino Micro Programm läuft nicht auf dem Mega


von Black D. (Gast)


Lesenswert?

Moin zusammen,
ich habe ein Programm für den Arduino micro geschrieben aber jetzt ist 
mir aufgefallen, dass der Micro einfach zu wenig Speicherplatz hat. 
Deshalb wollte ich jetzt auf den Mega umsteigen. Irgendwie scheint aber 
ein einfaches auswählen des Mega Boards nicht zu reichen. Muss ich die 
Timer noch anpassen oder liegt es an was anderem?
1
void setup(){
2
pinMode(5,OUTPUT);
3
pinMode(6,OUTPUT);
4
pinMode(A0,INPUT);
5
6
// Timer1 instalisieren
7
TCCR1A = 0;                     //Register definiert zurücksetzten
8
TCCR1B = 0;                     //zuerst Register definiert zurücksetzen
9
TCNT1 = 0;                      //Zählerwert zurücksetzten
10
11
OCR1A = 199;                    //Timer1 80kHZ einstellen
12
TCCR1B |= (1 << WGM12);         //CTC mode
13
//TCCR1B |= (0 << CS12) | (0 << CS11) | (1 >> CS10); //kein Prescale
14
TCCR1B |= (1 << CS10);          // clk/1 prescale 1024
15
TIMSK1 |= (1 << OCIE1A);        //Aktivieren des Timer-Vergleichs-Interrupt
16
}
17
18
ISR(TIMER1_COMPA_vect){         //Interrupt
19
20
//Signalvergleich
21
if (D[n] < val*S[m]) {          //Dreiecksignal kleiner als Sinussignal
22
bitSet(PORTC, 6);               //Pin 5 HIGH
23
}
24
else {                          //Dreiecksignal größer als Sinussignal
25
bitClear(PORTC, 6);             //Pin 5 LOW
26
}
27
if (D[n] < val*S[m]) {          //Dreiecksignal kleiner als Sinussignal
28
bitSet(PORTD, 7);               //Pin 6 HIGH
29
}
30
else {                          //Dreiecksignal größer als Sinussignal
31
bitClear(PORTD, 7);             //Pin 6 LOW
32
}
33
34
//Sinusarray hochrechnen
35
m=m+1;
36
if(m>1599)
37
m=0;
38
39
//Dreieckarray hochrechnen
40
n=n+1;
41
if(n>15)
42
//if(n>7) //10kHz
43
n=0;
44
}
45
46
void loop() {
47
p = analogRead(A0);             //Potiwert
48
plot = map(p, 0, +500, 1, 5);   //Amplituden der Sinussignal bestimmen
49
//map(value, fromLow, fromHigh, to Low, toHigh)
50
//
51
//delay(300);
52
val=plot;                       //val ist der Wert vom Poti mit dem gerechnet wird
53
}

von WePe (Gast)


Lesenswert?

Sind die Timer und Register bei beiden Controllern wirklich identisch?

von A. F. (qq_q)


Lesenswert?

Wirf einen Blick in die Datenblätter der µCs und vergleiche die 
Schaltpläne der Arduino-boards an. Dann portiere dein Programm.

Black D. schrieb:
> dass der Micro einfach zu wenig Speicherplatz hat.

Was geht denn aus, Flash, Ram oder EEprom?

Möglicherweise genügt es dein Programm zu optimieren und/oder auf den 
Arduino-Overhead zu verzichten, wie du das bereits in großen Teilen des 
geposteten Codes tust.

von Black D. (Gast)


Lesenswert?

WePe schrieb:
> Sind die Timer und Register bei beiden Controllern wirklich identisch?

Werde ich mal kontrollieren danke.

A. F. schrieb:
> Was geht denn aus, Flash, Ram oder EEprom?
>
> Möglicherweise genügt es dein Programm zu optimieren und/oder auf den
> Arduino-Overhead zu verzichten, wie du das bereits in großen Teilen des
> geposteten Codes tust.

Ich brauche Platz für ein array für 9600 Einträgen um daraus eine 
Sinuskurve zu generieren. Klar das geht natürlich auch mit viel weniger 
eintragen. Ich vergleiche diese aber mit einem Dreiecksignal um darauf 
eine Sinusförmige PWM zu erzeugen.

Ich habe sonst auch noch einen stm32 f767zi hier aber da weiß ich noch 
nicht wie man den richtig programmiert.

von Schlaumaier (Gast)


Lesenswert?

Black D. schrieb:
> Ich brauche Platz für ein array für 9600 Einträgen um daraus eine
> Sinuskurve zu generieren.

Gibt es auch die Möglichkeit einen Speicherchip als "externer 
Datenspeicher" anzubinden. Aber ein Mega ist von der Größe her mal 
abgesehen, sicher die einfachere Lösung.

Vielleicht solltest du auch schauen ob der "Board-Treiber" auf den 
neusten Stand ist.

Und ob die richtige Revision ausgesucht wurde.

Bei den Nano gibt es 2 Bootloader. Meine Nanos wollen immer den alten. 
Sonst macht der Arduino-Compiler Stress.

Und nicht vergessen. Der Mega hat ein ganz anderes Pin-Layout. Einfach 
gesagt, beim Nano ist i2c Pin 4+5. beim Mega i.d.R. 20 + 21.

von Schlaumaier (Gast)


Lesenswert?

Nachtrag: Bei China-Teilen ist es oft ratsam, die Baudrate 
herunterzusetzen.

Und schau dir mal die Fehlermeldungen des Compiler an. Notfalls hier 
posten.

von Helmut -. (dc3yc)


Lesenswert?

Black D. schrieb:
> Ich brauche Platz für ein array für 9600 Einträgen um daraus eine
> Sinuskurve zu generieren.

Sind die 9600 Stützstellen ein ganzer Sinus oder nur ein Viertel davon? 
Du brauchst nämlich nur ein Viertel Sinus, die anderen 3/4 kann man 
einfach berechnen.

von Max M. (Gast)


Lesenswert?

Black D. schrieb:
> Ich brauche Platz für ein array für 9600 Einträgen

Du weist aber das Du nur ein Viertel der Sinuskurve ablegen musst, um 
durch Zählrichtung und Vorzeichen einen kompletten Sinus herzustellen?

Raufzählen bis Ende Array, dann runterzählen bis erste Position Array, 
Vorzeichen negieren, und das gleiche nochmal, dann bist Du wieder am 
Anfang.
Mit einer viertel Tabelle, wo das Vorzeichen nicht im Array gespeichert 
werden muss. Also 9bit Auflösung mit einem Byte Speicherplatz.

Edit:
Helmut war schneller

von Black D. (Gast)


Lesenswert?

Das stimmt natürlich mit der Berechnung. Wie würde das denn im code 
aussehen? Ich weiß grad nicht wie ich das programmieren würde.

von A. F. (qq_q)


Lesenswert?

Black D. schrieb:
> Das stimmt natürlich mit der Berechnung. Wie würde das denn im code
> aussehen? Ich weiß grad nicht wie ich das programmieren würde.

https://stackoverflow.com/a/3689139

oder hier:

Quelltext:
https://www.atwillys.de/content/cc/sine-lookup-for-embedded-in-c/
Erklärung:
https://www.atwillys.de/content/explained/sine-lookup-function/

von Axel S. (a-za-z0-9)


Lesenswert?

Tja. Das ist kein Arduino Programm, denn du greifst direkt auf die 
Hardware-Register zu. Offensichtlich stimmen die bei den beiden 
Arduino-Boards (respektive den darauf befindlichen µC) nicht überein.


Black D. schrieb:
> Ich brauche Platz für ein array für 9600 Einträgen um daraus eine
> Sinuskurve zu generieren.

Warum so viele? Wenn dein Sinus mit 8 Bit Amplitudenauflösung erzeugt 
wird, reichen auch 256 oder 512 Stützstellen. Und wenn es nur der 
Sinus sein soll, kann man die Tabelle auch in den Flash legen und muß 
kein knappes RAM dafür ver(sch)wenden.

Das hat Jesper Hansen bei seinem Jesper-DDS (aka poor mans DDS) schon 
vor über 20 Jahren so gemacht. War ein AT90S2313. Die Seite gibts schon 
nicht mehr. Aber Mirrors findet man noch.

http://www.radanpro.com/Radan2400/mikrokontroleri/Jesper%27s%20AVR%20pages%20-%20MiniDDS.htm

: Bearbeitet durch User
von Schlaumaier (Gast)


Lesenswert?

Axel S. schrieb:
> kann man die Tabelle auch in den Flash legen und muß
> kein knappes RAM dafür ver(sch)wenden.

Ich würde für ein paar Euro ein SD-Karten-Reader einbauen.

Da habe ich DATEN-Speicher ohne Ende.

Die Daten in eine "Seq-Datenbank" mit Festen Stellen anlegen, und dann 
einfach die passenden Daten dort holen.

von Sebastian W. (wangnick)


Lesenswert?

Hallo Black D,

beim Arduino Micro wird der Arduino-Pin D5 über PORTC6 angesteuert und 
der Arduino-Pin D6 über PORTD7. Beim Arduino Mega 2560 sind aber für den 
Arduino-Pin D5 PORTE3 und für D6 PORTH3 zuständig. Siehe die Dateien 
"pins_arduino.h" in den Ordnern C:\Program Files 
(x86)\Arduino\hardware\arduino\avr\variants\<Variante>, oder 
https://docs.arduino.cc/hardware/micro 
(https://docs.arduino.cc/static/777a1c066b7b2060eba932b9cc3eed5a/A000053-pinout.png) 
versus https://docs.arduino.cc/hardware/mega-2560 
(https://docs.arduino.cc/static/2de2c8ff00fc05065634e3823a9266c4/A000067-pinout.png).

Damit dein Programm funktioniert musst du also die Parameter von bitSet 
und bitClear entsprechend anpassen.

LG, Sebastian

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Black D. schrieb:
> Ich brauche Platz für ein array für 9600 Einträgen um daraus eine
> Sinuskurve zu generieren.

Wenn du für eine brauchbare Sinuskurve alle 0.01° eine Stützstelle 
brauchst, solltest du mal über deinen Algorithmus nachdenken.

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.