Go Down

Topic: Serielle Verbindung Atmega8 (Read 758 times) previous topic - next topic

Lena

Hallo Arduiono Freunde,

ich spiele seit einigen Tagen mit der Arduino IDE herum.
Hierzu verwende ich kein Arduino Board sondern einen Atmega8 auf einem Steckbrett.
Das funktioniert soweit auch recht gut und ich konnte die ersten Beispiele erfolgreich mit meinem mySmartUSBlight über "Upload mit Programmer" auf den Atmega übertragen und starten.
Als Board habe ich das "Arduino NG or older w atmega8" ausgewählt.
Der Chipläuft mit eigenem 8MHz Quarz.
Nun wollte ich über die serielle Schnittstelle (Atmega Pin 2 & 3) über einen CP210x USB <> RS232/TTL Adapter zunächst Daten an den PC übertragen.
Der Adapter funktioniert einwandfrei, denn ich verwende sie anderweitig regelmässig.
Als ersten Test habe ich einfach in ein bestehendes Programm die Initialisierung in das Setup eingefügt und lasse in der Loop im Sekundentakt Werte ausgeben.
Das Problem ist nun, das zwar Daten im richtigen Rythmus ankommen, aber die sind unleserlicher Müll.
Die Schnittstellenparameter sind identisch eingestellt (auf der Chipseite setze ich nur die Serial.begin(9600)) und es ist auch egal, ob ich ein Terminalprogramm oder den SerialMonitor der IDE verwende.
Hier der Code, der an sonsten einwandfrei abgearbeitet wird:

Code: [Select]

/*
  Calibration

Demonstrates one technique for calibrating sensor input.  The
sensor readings during the first five seconds of the sketch
execution define the minimum and maximum of expected values
attached to the sensor pin.

The sensor minimum and maximum initial values may seem backwards.
Initially, you set the minimum high and listen for anything
lower, saving it as the new minimum. Likewise, you set the
maximum low and listen for anything higher as the new maximum.

The circuit:
* Analog sensor (potentiometer will do) attached to analog input 0
* LED attached from digital pin 9 to ground

created 29 Oct 2008
By David A Mellis
modified 30 Aug 2011
By Tom Igoe

http://arduino.cc/en/Tutorial/Calibration

This example code is in the public domain.

*/

// These constants won't change:
const int sensorPin = A0;    // pin that the sensor is attached to
const int led_dim_Pin = 9;        // pin that the dimmed LED is attached to
const int led_status_Pin = 2;        // pin that the stus LED is attached to

// variables:
int sensorValue = 0;         // the sensor value
int sensorMin = 1023;        // minimum sensor value
int sensorMax = 0;           // maximum sensor value


void setup() {
  // turn on LED to signal the start of the calibration period:
  pinMode(led_status_Pin, OUTPUT);
  digitalWrite(led_status_Pin, HIGH);
  Serial.begin(9600);

  // calibrate during the first five seconds
  Serial.println("starte Kalibrierung");
  while (millis() < 5000) {
    sensorValue = analogRead(sensorPin);

    // record the maximum sensor value
    if (sensorValue > sensorMax) {
      sensorMax = sensorValue;
    }

    // record the minimum sensor value
    if (sensorValue < sensorMin) {
      sensorMin = sensorValue;
    }
  }

  // signal the end of the calibration period
  digitalWrite(led_status_Pin, LOW);
  Serial.println("Kalibrierungsende");
  delay(1000);
}

void loop() {
  // read the sensor:
  sensorValue = analogRead(sensorPin);

  // apply the calibration to the sensor reading
  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

  // in case the sensor value is outside the range seen during calibration
  sensorValue = constrain(sensorValue, 0, 255);

  // fade the LED using the calibrated value:
  analogWrite(led_dim_Pin, 255 - sensorValue);
  Serial.println(sensorValue);
  delay(100);
}


Hat jemand eine Idee, was ich falsch mache?

Vielen Dank

Lena
„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher."

Albert Einstein

sth77

In der boards.txt steht das: atmega8.build.f_cpu=16000000L. Mit deinem 8MHz-Quarz bist du also nur halb so schnell, wie du eigentlich müsstest.
Um das festzustellen, könntest du ein LED im Sekundenrhythmus blinken lassen bzw. es versuchen. Blinkt sie im 2-Sekunden-Takt, liegt es definitiv am Quarz.
In der Theorie könntest du wohl auch eine halb so große Bitrate im Terminalprogramm einstellen, um lesbare Werte zu bekommen.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Lena

Bingo!

Kurz im Terminalprogramm auf 4800 geschaltet und siehe:
Code: [Select]

starte Kalibrierung
Kalibrierungsende
163
173
142
183
183
204
193
u.s.w.


Da hätte ich mir noch 'nen Wolf gesucht - vielen Dank!
Dann geht es jetzt weiter mit der Gegenrichtung.
Hatte glückcherweise noch einen 16 MHz Quarz in der Grabbelkiste :-)

Super, hier wird einem ja irre schnell geholfen - bin beeindruckt!

LG Lena
„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher."

Albert Einstein

Lena

Puh, gerade noch mal gut gegengen.
Irgendwie mochte mein Atmega8 den 16MHz Quarz nicht so richtig und war nach dem nächsten Brennversuch nicht mehr ansprechbar :-(
Zum Glück hatte ich noch einen 1 MHz Oszilliator zur Verfügung und konnte ihn so mit meinem AVR Dragon "reanimieren"
Nun habe ich doch wieder den 8 MHz drin und die Board.txt entsprechend geändert.
Nun läuft zumindest wieder das oben gepostet Programm.
Drückt mir die Daumen, dass das Dimmer Beispiel jetzt nicht wieder den µC zerschießt.

LG Lena
„Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher."

Albert Einstein

Go Up