mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC am AT90CAN128 funktioniert nicht, Fehler im Code?


Autor: Mike G. (Firma: ixwyc) (balu1980)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich möchte den AD Wandler Eingang PA0 am AT90CAN128 auszulesen, und den
gelesenen Wert an der Schnittstelle USART0 auszugeben.

Die Initialisierung und das senden der Zeichenfolge "neu: " der USART
funktoniert sobald ich die zum ADC gehörenden Zeilen in der main routine
ausklammere. Sobald die ADC Zeilen dazu kommen funktioniert nix mehr.

Beschaltet habe ich den AT90CAN128 mit einer externen Referenzspannung 
von
1,55V. An den Eingang PA0 habe ich über einen Tiefpassfilter ein 
Audiosignal gegeben (SS 0,775V), welches über den Spannungsteiler
verschoben wird, da meines Wissens nach der µC die negative Halbwelle 
nicht
erfassen kann. siehe Anhang.

Habe ich im Quelltext einen Fehler, oder waran liegt es?

Ein weiteres Problem was ich habe ist, das die Baudratenberechnung nicht
funktioniert. Trage ich die 8 ein funktioniert es.

Gruß Mike


Code:

#include <avr/io.h>

//---------------------------------------------------------------------- 
----

#ifndef F_CPU
// Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert ist

#define F_CPU 16000000UL
// Quarz mit 16 Mhz definiert

#endif

#define UART_BAUD 115200
// Baudrate auf 115200 Baud gesetzt

#define UART_BAUD_REAL (((F_CPU)/(UART_BAUD*16))-1)
// Kontrollberechnung Baudrate

//---------------------------------------------------------------------- 
----

void UART_init (void)
//  UART initialisieren
{
  UBRR0H = 0;
  UBRR0L = 8;
  //UBRR0L = UART_BAUD_REAL; -->Funktioniert nicht<--
  // Baudrate setzen

  UCSR0C = (0 << UMSEL0) | (0 << UPM0) | (1 << USBS0) | (3 << UCSZ0);
  // Signal Format: 8data, no parity, 2 stop bits

  UCSR0B = (1 << RXEN0) | (1 << TXEN0);
  // Aktivieren des Empfängers und des Senders der UART0
}

void UART_send (unsigned char UART_send)
{
  while (!(UCSR0A & (1<<UDRE0)));
  // Warten bis senden bereit

  UDR0 = UART_send;
  //Schreibt Daten auf die Uart
}

//---------------------------------------------------------------------- 
----

void ADC_init(void)
{
  ADMUX = 0;
  // Kanal AD0 gewählt

  ADMUX |= (1 << REFS0);
  // Externe Rferenzspannung verwenden

  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)
  | (1 << ADATE);
  // ADC aktivieren, Teilungsfaktor auf 128

  ADCSRA |= (1 << ADSC);
  while (ADCSRA & (1 << ADSC))
  {
    ;
  }
  // Eine ADC Wandlung zum Warmlaufen ohne den Wert zu übergeben
}

//---------------------------------------------------------------------- 
----

unsigned int ADC_read()
{
  ADCSRA |= (1<<ADSC);
  // eine Wandlung

    while ( ADCSRA & (1<<ADSC) )
  {
      ; // auf Abschluss der Konvertierung warten
    }

    return ADCW;
  // Wandlungsergebnisse zurückgeben
}

//---------------------------------------------------------------------- 
----

int main (void)
{

  unsigned int ADC_wert;

  UART_init();

  ADC_init();


  for (;;)
  {

    UART_send('N');
    UART_send('E');
    UART_send('U');
    UART_send(':');
    UART_send(' ');

  ADC_wert = ADC_read();

  UART_send (ADC_wert);


   }
}

Autor: Mike G. (Firma: ixwyc) (balu1980)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
habe doch glatt das jpg vergessen

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist jetzt ja nun nicht der richtige Eingang für den AD-Wandler.
Datenblatt:
>Port A is an 8-bit bi-directional I/O port
AD0 heisst Adresse+Daten Bit 0

Schon besser wäre:
>Port F serves as the analog inputs to the A/D Converter
hier z.B. AIN0

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rechne mal von Hand (mit dem Taschenrechner) aus,
was die Baudratenformel hergibt:
7,68055555
Also werden hier 7 eingetragen.

Ich würde da mal behaupten, dass du die 115200 Baud
nicht zuverlässig bekommen wirst (mit 10% Fehler).

Erst mit 38400 werden mit weniger als 1% Fehler erreicht,
das geht sicher.

Autor: Mike G. (Firma: ixwyc) (balu1980)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

vielen dank für deine Antwort lkmiller, wer lesen kann ist klar im 
Vorteil.....

Weis auch nicht was mich da mit dem ADC geritten hat, habe mich in die
irre führen lassen.

So, hab jetzt das Signal auf PF0 umgelötet, und siehe da es funktioniert
etwas. Ich bekomme Aber nur Sonderzeichen über die UART gesendet, der 
Hinweis
"Neu: " kommt wie gewünscht. Danach nur Karos, Herzen, etc.

Wie bekomme ich hier nur vernünftige Zahlenwerte?

Mit der Baudratenberechnung habe ich die 7 mal ausprobiert, es 
funktioniert
nicht.


Gruß Mike

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mit der Baudratenberechnung habe ich die 7 mal ausprobiert, es
>funktioniert nicht.
FULL ACK
Was ich sagen wollte, ist:
Auch mit 8 für 115200 Baud funktioniert es nur sehr zufällig!
An einem anderen PC oder einer anderen RS232-Schnittstelle
geht dann eben ab und an mal was schief.

Erst mit Baudrate 38400 ist die Übertragung sicher.



Klar, dass nach "NEU:  " immer nur 1 (ein) Sonderzeichen kommt.
UART_send verschickt genau 1 Zeichen (Byte).
>  UART_send (ADC_wert);
Nur das Low-Byte vom ADC_wert wird verwendet
und nur ein Teil des Wertebereichs sind lesbare ASCII-Zeichen.

Sieh mal nach itoa() und versuch den Ergebnis-String zu senden.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und informiere dich über Baudratenquarze - dann klappt's auch mit 
den höheren Baud-Raten ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.