AVR Workshop: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
K
Zeile 1: Zeile 1:
 +
[[Category:Zerties]]
 
==  AVR (Atmega8) Workshop ==
 
==  AVR (Atmega8) Workshop ==
  

Version vom 2. April 2009, 17:27 Uhr

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?

  1. Programmieradapter bauen
  2. Programmiersoft installieren
  3. Den Atmega8 programmieren
  4. Programm mit dem gcc-avr erstellen (FnordLicht ;))
  5. InfrarotErkennung
  6. i2c BootLoader
  7. IrEinschalter
  8. UsbAvr
  9. BinaerUhr
  10. AvrLcd
  11. .....

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/

Avr workshop 11.02.06.jpg

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";

Der I2C Parport Adapter ist aus der Kernel Dokumentation entnommen und leicht abgewandelt damit er mit einem 74HC04 statt eines HC05 klar kommt
Hier die Schaltung mit einem 74HC03

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.

Code für eine LED an PB1