Pollin Funk-AVR-Evaluationsboard

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Aufbau

Praktisch ist nichts besonderes zu vermelden. Für einen Ungeübten (mich) hat der Aufbau ca. 2 h gedauert. Gegen Ende der Löterei lies meine Konzentration nach und ich musste ein paar unsaubere Lötstellen mit Entlötlitze nachbehandeln. Besser eine Pause machen.

Technisch/elektrisch siehe unter Weblinks der Erfahrungsbericht von Marco Schmoll (www.controller-designs.de).

Funktionstests

Nach der genauen Betrachtung mit einer Lupe und keinen Auffälligkeiten wurde eine 9V Gleichspannung an die Klemme J5 angelegt. LED NETZ leuchtet. LED1 und LED2 sind aus. Mein Netzteil kann den Strom anzeigen. Folgende Werte wurden beobachtet:

  • ca. 20 mA bei AVR nicht eingesetzt, MAX232 nicht eingesetzt
  • ca. 22 mA bei AVR nicht eingesetzt, MAX232 nicht eingesetzt, RESET gedrückt
  • ca. 25 mA bei AVR nicht eingesetzt, MAX232 eingesetzt
  • ca. 26 mA bei AVR nicht eingesetzt, MAX232 eingesetzt, RESET gedrückt
  • ca. 30 mA bei ATmega8 eingesetzt, MAX232 eingesetzt

Einstellen der Taktquelle

Die folgenden Kommandozeilen beziehen sich auf einen Windows PC.

Parallelport ISP Typ STK200

ATmega8 Fuses lesen

@echo off
echo Parallelport ISP Typ STK200
echo Lese ATmega8 Fuses
d:\winavr\bin\avrdude -v -p atmega8 -c stk200 -P lpt1

Die Schnittstelle LPT1 ist an die verwendete Schnittstelle auf dem PC anzupassen. Ebenso der Pfad zu dem Programm avrdude.exe.

Siehe auch

  • AVR Fuses
  • AVRDUDE
  • AVR Fuse Calculator von Mark Hämmerling. In den dortigen Default-Einstellungen ist der Watchdog aktiviert. Lässt man das so, funktioniert das Programm Blinky (s.u.) nicht wie erwartet: Nur LED2 zappelt, LED1 ist meist aus, weil vor dem Umschalten von LED1 der Watchdog den Atmega8 resettet, d.h. das Programm von neuem starten lässt.

ATmega8 1 MHz RC

@echo off
echo Parallelport ISP Typ STK200
echo Setze ATmega8 Fuses auf 1 MHz interner RC-Oszillator
d:\winavr\bin\avrdude -v -p atmega8 -c stk200 -P lpt1 -U lfuse:w:0xC1:m -U hfuse:w:0xD9:m

ATmega8 12 MHz Quarz

Wenn das Board nach Anleitung aufgebaut wurde, d.h. in Q2 der 12,000 MHz Quarz eingesetzt wurde, kann man den ATmega8 auf max. 12 MHz einstellen:

@echo off
echo Parallelport ISP Typ STK200
echo Setze ATmega8 Fuses auf 12 MHz Quarz
d:\winavr\bin\avrdude -v -p atmega8 -c stk200 -P lpt1 -U lfuse:w:0x2F:m -U hfuse:w:0xD9:m

Serieller ISP auf dem Board

ATmega8 Fuses lesen

@echo off
echo Serieller ISP auf dem Board
echo Lese ATmega8 Fuses
d:\winavr\bin\avrdude -v -p atmega8 -c ponyser -P com1

Die Schnittstelle COM1 ist an die verwendete Schnittstelle auf dem PC anzupassen. Wichtig ist, dass kein zusätzlicher Parallelport-ISP angeschlossen ist. Wenn doch, wird der Atmega8 nicht erkannt!

ATmega8 1 MHz RC

@echo off
echo Serieller ISP auf dem Board
echo Setze ATmega8 Fuses auf 1 MHz interner RC-Oszillator
d:\winavr\bin\avrdude -v -p atmega8 -c ponyser -P com1 -U lfuse:w:0xC1:m -U hfuse:w:0xD9:m

ATmega8 12 MHz Quarz

Wenn das Board nach Anleitung aufgebaut wurde, d.h. in Q2 der 12,000 MHz Quarz eingesetzt wurde, kann man den ATmega8 auf max. 12 MHz einstellen:

@echo off
echo Serieller ISP auf dem Board
echo Setze ATmega8 Fuses auf 12 MHz Quarz
d:\winavr\bin\avrdude -v -p atmega8 -c ponyser -P com1 -U lfuse:w:0x2F:m -U hfuse:w:0xD9:m

Programm ins Flash-ROM schreiben

Im folgenden wird angenommen, dass die zu programmierende Datei im iHEX-Format unter dem Namen atmega8.hex im aktuellen Verzeichnis befindet.

Parallelport ISP Typ STK200

@echo off
echo Parallelport ISP Typ STK200
echo Programmiere Atmega8 Flash-ROM mit Datei atmega8.hex
d:\winavr\bin\avrdude -p atmega8 -c stk200 -P lpt1 -e -U flash:w:atmega8.hex

Serieller ISP auf dem Board

@echo off
echo Serieller ISP auf dem Board
echo Programmiere Atmega8 Flash-ROM mit Datei atmega8.hex
d:\winavr\bin\avrdude -p atmega8 -c ponyser -P com1 -e -U flash:w:atmega8.hex

Beispielprogramme

Blinky

Die beiden LED LED1 und LED2 auf dem Board sollen im 1s Takt wechselweise An und Aus gehen.

Die beiden On-board-LEDs sind active-high geschaltet, d.h. wenn am Pin des AVR ein logische 1 (HIGH Pegel) ausgegeben wird, leuchtet die LED. Wird eine logische 0 (LOW Pegel) ausgegeben, leuchtet die LED nicht. Das ist andersrum als im AVR Tutorial.

<c> /*

   Atmega8
   Pollin Funk-AVR-Evaluationsboard v1.1
   Project -> Configuration Options in AVR Studio:
   Frequency:    1000000 bzw. 12000000
   Optimization: -Os
  • /
  1. include <avr/io.h>
  2. include <util/delay.h>

// LEDs sind active-high geschaltet

  1. define LED_AN(LED) (PORTD |= (1<<(LED)))
  2. define LED_AUS(LED) (PORTD &= ~(1<<(LED)))
  3. define LED_TOGGLE(LED) (PORTD ^= (1<<(LED)))
  4. define LED1 PD6
  5. define LED2 PD5
  6. define TASTER PB1

int main(void) {

 DDRB &= ~(1<<TASTER);          // Port B: Eingang für Taster
 DDRD |= (1<<LED1) | (1<<LED2); // Port D: Ausgang für LED1 und LED2
 // Anfangseinstellung
 LED_AN(LED1);
 LED_AUS(LED2);
 while(1)
 {
   _delay_ms(1000);  // Wert 1000 erlaubt ab avr-libc 1.6
   LED_TOGGLE(LED1);
   LED_TOGGLE(LED2);
 }

} </c>

Tasty

Wenn der On-board-Taster TASTER1 nicht gedrückt ist (Ruhezustand), soll die LED1 leuchten und LED2 soll nicht leuchten. Solange der User den Taster TASTER1 gedrückt hält, soll sich der Zustand der LEDs umkehren.

Der On-board-Taster TASTER1 ist ebenfalls active-high (siehe AVR-GCC-Tutorial) geschaltet, d.h. wenn der Taster geschlossen ist, liegt am Pin PB1 des AVR eine logische 1 (HIGH Pegel) an. Ist der Taster offen, liegt eine eine logische 0 (LOW Pegel) an. Das ist andersrum als im AVR Tutorial.

<c>

/*

   Atmega8
   Externer Quarz-Oszillator: 12 MHz
   Pollin Funk-AVR-Evaluationsboard v1.1
  • /
  1. include <avr/io.h>
  2. include <util/delay.h>

// LEDs sind high-active geschaltet

  1. define LED_AN(LED) (PORTD |= (1<<(LED)))
  2. define LED_AUS(LED) (PORTD &= ~(1<<(LED)))
  3. define LED_TOGGLE(LED) (PORTD ^= (1<<(LED)))
  4. define LED1 PD6
  5. define LED2 PD5

// TASTER ist high-active geschaltet

  1. define TASTER PB1
  2. define TASTER_GEDRUECKT() (PINB & (1<<TASTER))

int main(void) {

 DDRB &= ~(1<<TASTER);	         // Port B: Eingang für Taster
 DDRD |= (1<<LED1) | (1<<LED2); // Port D: Ausgang für LED1 und LED2
 while(1)
 {
   if (!TASTER_GEDRUECKT())
   {
     // Taster ist nicht (!) gedrückt
     LED_AN(LED1);
     LED_AUS(LED2);
   }
   else
   {
     // Taster ist gedrückt
     LED_AUS(LED1);
     LED_AN(LED2);
   }
 }

}

</c>

2-Bit Zähler

Jeder Tastendruck auf TASTER1 soll eine Variable um Eins hochzählen. Der Inhalt der unteren beiden Bits der Zählvariable soll mit den beiden LEDs angezeigt werden.

Das Hochzählen darf nur erfolgen, wenn ein Wechsel von Offen nach Geschlossen stattfindet. Das Programm muss also berücksichtigen, ob ein Wechsel von "Taster offen" zu "Taster geschlossen" stattfindet und ob der Taster in einer Position gehalten wird.

Mit diesem Beispiel kann man grob feststellen, ob der TASTER1 auf dem Board zum Prellen neigt, d.h. wenn sich der Zählerstand nicht wie gewollt pro Tastendruck um Eins erhöht und ob deshalb eine spezielle Routine zur Entprellung erforderlich ist.

Mein Board zeigt bei diesem Programm keine Neigung zum Prellen. Die auf dem Board vorhandene Hardwareentprellung über einen Tiefpassfilter mit C17 330 nF zwischen Taster und GND erfüllt hier ihren Zweck.

<c>

/*

   Atmega8
   Externer Quarz-Oszillator: 12 MHz
   Pollin Funk-AVR-Evaluationsboard v1.1
  • /
  1. include <avr/io.h>
  2. include <util/delay.h>
  3. include <inttypes.h>

// LEDs sind high-active geschaltet

  1. define LED_AN(LED) (PORTD |= (1<<(LED)))
  2. define LED_AUS(LED) (PORTD &= ~(1<<(LED)))
  3. define LED_TOGGLE(LED) (PORTD ^= (1<<(LED)))
  4. define LED1 PD6
  5. define LED2 PD5

// TASTER ist high-active geschaltet

  1. define TASTER PB1
  2. define TASTER_GEDRUECKT() (PINB & (1<<TASTER))
  3. define TASTE_AUF 0
  4. define TASTE_ZU 1

void ausgabe(uint8_t wert) {

 if (wert & (1<<0)) // Bit 0
   LED_AN(LED1);
 else
   LED_AUS(LED1);
 if (wert & (1<<1)) // Bit 1
   LED_AN(LED2);
 else
   LED_AUS(LED2);

}

int main(void) {

 uint8_t alter_tastenzustand = TASTE_AUF;
 uint8_t zaehler = 0;
 DDRB &= ~(1<<TASTER);			// Port B: Eingang für Taster
 DDRD |= (1<<LED1) | (1<<LED2);	// Port D: Ausgang für LED1 und LED2
 while(1)
 {
   ausgabe(zaehler);
   if (TASTER_GEDRUECKT() && (alter_tastenzustand == TASTE_AUF))
   {
     // Wechsel von OFFEN nach GESCHLOSSEN
     zaehler++;
     alter_tastenzustand = TASTE_ZU;
   }
   if (!TASTER_GEDRUECKT())
     alter_tastenzustand = TASTE_AUF;
 }

}

</c>

(Wird fortgesetzt)

Weblinks