Forum: Mikrocontroller und Digitale Elektronik C Code AD-Wandler


von Georg (Gast)


Lesenswert?

Hallo,

ich habe ein evaluation board gekauft und der Hersteller lieferte dazu 
paar Beispiel Codes um mit dem Board bisschen spielen zu können.
Die Hardwarenahe C-Programmierung ist zwar neuland für mich aber ich bin 
trotzdem der Meinung, dass es so nicht funktionieren kann (Es 
funktioniert auch nicht).
Laut Hersteller Soll der Speaker an PC.0 angeschlossen werden. Ich sehe 
aber nirgendswo im Code, dass der C Port konfiguriert wurde! Oder, dass 
er die Anweisung bekommt, ein Signal auszugeben!

Ich wäre euch dankbar, wenn ihr mir da weiterhelft.

LG,

Georg
1
//--------------------------------------------------------------------------
2
// Titel         : Beispiel "Analog-Digital-Wandler" für dem ATmega8
3
//--------------------------------------------------------------------------
4
// Funktion      : Wandelt ein analoges Signal in ein digitales
5
// Schaltung     : Poti an PC.0, SPeaker an PB.0, AVCC, AGND, AVREF
6
//--------------------------------------------------------------------------
7
8
unsigned char timer_value;
9
ISR (TIMER0_OVF_vect)
10
{
11
  PORTB = ~ PORTB;    // Flankenwechsel für Tonfrequenz
12
  TCNT0 = timer_value;
13
}
14
15
ISR(ADC_vect)
16
{
17
  int adc_value;
18
  adc_value=ADC;
19
  timer_value=char(adc_value/4);
20
  sbi  (ADCSRA,6);      // restart ADC
21
}
22
23
void adcInit()
24
{
25
  ADMUX=0;
26
  ADCSRA=0xDD;      //0b11011101, ADC-Clock, ADC ON, INT ON
27
}
28
29
void timer0Init()
30
{
31
  timer_value=0xFF;
32
  TCCR0=0x03;        // 0b00000011, Vorteiler 64
33
  TIMSK=0x01;        // 0b00000001, maskiere Timer-INT
34
}
35
36
void portsInit()
37
{
38
  sbi(DDRB,0);      //OUT Summer
39
  sbi(DDRB,1);      //OUT LED
40
}
41
42
//----------------------------------------------------------------------
43
main ()                // Hauptprogramm, startet bei Power ON und Reset
44
{
45
  //Initialisierung
46
  portsInit();      // PortB als Ausgang initialisieren
47
  timer0Init();      // Timer Interrupt initialisieren
48
  adcInit();
49
  sei();                          // enable interrupts
50
  do { } while(true);    // mainloop
51
}
52
//----------------------------------------------------------------------

von Peter II (Gast)


Lesenswert?

Georg schrieb:
> Laut Hersteller Soll der Speaker an PC.0 angeschlossen werden

laut Quellcode aber an

> sbi(DDRB,0);      //OUT Summer


B0

von Waldemar Z. (waldemar_z)


Lesenswert?

Das steht:
---
Poti an PC.0, SPeaker an PB.0
---

der adc ist scheinbar auf pc0 eingerichtet. Speaker soll an pb0

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


Lesenswert?

Georg schrieb:
> unsigned char timer_value;

Schreib da mal bitte ein 'volatile' davor. Der Grund ist, das der 
Compiler zwar sieht, das du im Hauptprogramm diese Variable vorbesetzt, 
für ihn sind ISR Routinen aber Programmteile, die nie angesprungen 
werden.
'volatile' weist den Compiler an, trotzdem diese Variable nicht 
wegzuoptimieren.

von Georg (Gast)


Lesenswert?

Waldemar Z. schrieb:
> der adc ist scheinbar auf pc0 eingerichtet. Speaker soll an pb0

klar... sorry mein Fehler... Ich meinte natürlich PB.0
Ich sehe aber trotzdem keine Zeile wo der PORT C defeniert wird.

von Peter II (Gast)


Lesenswert?

Georg schrieb:
> Ich sehe aber trotzdem keine Zeile wo der PORT C defeniert wird.

Input ist doch der Standard, da muss nichts definert werden.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Matthias S. schrieb:
> Schreib da mal bitte ein 'volatile' davor.

Das ist in dem Beispiel nicht nötig.

> Der Grund ist, das der Compiler zwar sieht, das du im Hauptprogramm
> diese Variable vorbesetzt, für ihn sind ISR Routinen aber
> Programmteile, die nie angesprungen werden.

Das würde er nur denken, wenn die Interruptroutine als static deklariert
wäre. Dann würde er die komplette Routine wegoptimieren.

Georg schrieb:
> Ich sehe aber trotzdem keine Zeile wo der PORT C defeniert wird.

Da muss auch nichts Spezielles für den PORT C definiert werden. Es muss
lediglich der Kanal über ADMUX eingestellt und der ADC über ADCSRA
aktiviert werden. Beides wird im Programm auch getan.

von Waldemar Z. (waldemar_z)


Lesenswert?

Georg schrieb:
> klar... sorry mein Fehler... Ich meinte natürlich PB.0
> Ich sehe aber trotzdem keine Zeile wo der PORT C defeniert wird.

Wenn der ADC auf PC0 eingestellt ist, wird PC0 als analoger Eingang 
verwendet, daher kann man den Pin nicht für digitale Ein-/Ausgaben 
verwenden.

Lies dazu mehr im Datenblatt des verwendeten Mikrocontrollers im 
Abschnitt zum ADC.

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.