AVR Workshop
Inhaltsverzeichnis
AVR (Atmega8) Workshop
neulich haben wir wieder einen Workshop veranstaltet, wer hat da eigentlich Bilder und Infos noch dazu?
In Memorial des ersten Workshops
Wir haben letzten Freitag damit gegonnen einen Programmieradapter für den Atmega8 zu bauen.
Wichtige Links:
Ziel des Workshops wird ein universeller IR-Schalter mit allem bibabo sein. Der dann für das FnordLicht und den DigitalerVideorekorder eingesetzt wird.
--Doc: da ist doch dann auch bestimmt auch ein Schalter für eine Steckdosenleiste mit drin (per Fernbedienung Stereoanlage, Hintergrundlicht (Fnord?), Videorekorder stromsparend ein- u. ausschalten. Ev. dann auch eine Farbkorrektur für den Fnord bis hin zum Mood-Light, wie Jochen es vorhatte?
- Programmieradapter bauen
- Programmiersoft installieren
- Den Atmega8 programmieren
- Programm mit dem gcc-avr erstellen (FnordLicht ;))
- InfrarotErkennung
- i2c BootLoader
- IrEinschalter
- UsbAvr
- BinaerUhr
- AvrLcd
- .....
Gesammelte Info:
Am Epia SP8000E Board kann man den i2c (SMBus) so zugänglich machen:
modprobe i2c-dev modprobe i2c-viapro
bei ((UserPagejochen|mir)) wurde der Bus als /dev/i2c-2 einbebunden:
linvdr:~# cat /sysfs/class/i2c-dev/i2c-2/name SMBus Via Pro adapter at 0500
Der Werdegang des Projekts:
Freitag 20.1.06, Tag 1:
- Geburt des Projekts
- Ideen generieren
- Lötübungen, Beginn der Planung des Programmieradapters
Samstag, 28.1.06, Tag 2:
- Installation gcc-avr, sp12 (Distributions-Abhängig)
- Fertigstellung der Programmierplatinen
- AvrMakefileTemplate
- Hello-world für AVR: geschafft: blinkende LED am B0
#define F_CPU 1000000L #include <avr/delay.h> #include <avr/io.h> #include <inttypes.h> int main(void) { DDRB = 0x01; while (1) { /* Endlosschleife weil 1 immer WAHR*/ if (PORTB==0x00) /* wenn schon LED aus, dann an */ PORTB = 0x01; /* LED an */ else PORTB = 0; /* LED aus */ _delay_ms(500);/* 500ms warten */ } return 0; }
Das mit den Fuse Bits setzten zur Takterhöhung (auf 8Mhz) ging so: 1. Auslesen:
jochen@debnb:~$ sp12 -rF SP12 version 2.1.0 performing init... Path to _sp12rc and _sp12dev: /home/jochen/.sp12/ Running in SP12 cable/dongle compatible mode. Enabling AVR serial reading/programming... The device code bytes 0,1,2: 0x1e, 0x93, 0x7 were read from parallel port 0x378 and indicate the following: You have connected an ATmega8 The device was made by Atmel 11100001 are the fuse bits read from an ATmega8 0xxxxxxx - BODLEVEL 4V (default 2.7V) x0xxxxxx - brownout detection enabled xxSUxxxx - reset delay, datasheet p28 xxxxCKSE - clock select, datasheet p24
Schreiben:
sp12 -wF11100100
Den Parport Aktivieren das die Schaltung Spannung erhält:
sp12 -P255
Freitag 11.02.06, Tag 3:
- Anlöten eines TSOP 1736 auf den Programmieradapter
- Erstellen eines Programms, dass "hello world" in Morsecode auf der LED ausgibt (Quellcode)
- Erstellen eines Programms zum Testen des TSOP 1736:
- Wenn der TSOP ein Signal bekommt, dann geht die LED an (Quellcode)
Leider gabs dann ein Poblem: manche neue Parallelports geben 3.3 Volt anstelle von 5 Volt aus. Und dann funktioniert der TSOP nicht. Lösung: externe Spannungsquelle
Die Soft Entwicklung haben wir jetzt im GIT ein Ceckout geht mit:
git clone http://brokenpipe.de/gitroot/bricolage/
Tag 4 alpha ;):
Umprogrammierung auf externen Quarz mit 10Mhz !! ist wahrscheinlich überflüssig da die Fernbedienungen Tolleranzen von bis zu 10% haben !!
sp12 -wF11101100 sp12 -wH1001001
also hat sich erledigt, falls jemand auch wieder zurück auf den internen Oszi auf 8Mhz wil (muss)l:
sp12 -wF11100100 sp12 -wH1011001
Folgende Änderungen habe ich gemacht um i2c und spi am gleichen Parport betreiben zu können. Am SP12 Adapter wurden die Pins 2 auf 8 und 3 auf 4 verlegt. In der Konfdatei avrdude.conf habe ich den Teil vom SP12 kopiert und angepasst:
programmer id = "sp12R"; desc = "Steve Bolt's Programmer"; type = par; vcc = 5,6,7; reset = 4; sck = 8; mosi = 9; miso = 11; ;
Im Home Verzeichnis habe ich die Datei .avrduderc erstellt. Inhalt:
default_programmer = "sp12R";
PWM mit Timer2 (8-Bit Timer)
Man (Didi) kann mit Timer2 ein PWM-Signal erzeugen. Für ne LED braucht man einen 64 Prescaler, bei einem 8Mhz Takt, damit die LED nicht flackert. Wenn man mehr als eine LED ansteuern will oder die LED an einem anderen Port betreibt, muss man den Timer einen Interupt bei COMPARE und bei OVERFLOW werfen lassen. (COMPARE ist es wenn der Timer einen bestimmten Wert erreicht hat). Bei COMPARE schaltet man die LED ein, bei OVERFLOW wieder aus. So kann man, indem man den Wert im Vergleichsregister ändert, die Heligkeit der LED steuern.