C Code AD-Wandler

Gast #4888160
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
//----------------------------------------------------------------------
Moderator #4888222
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.
#4888747
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.

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