Hallo zusammen,
ich hab mal wieder nix anderes zu tun als ne neue FAQ zu schreiben
Also diesmal geht es darum, wie man ein Programm strukturiert und
systematisch aufbaut. Ich hab ja sxhon ein paar Programmiersprachen
hinter mir Aber die richtige Struktur von einem Programm hab ich damals
in Pascal gelernt. Das zwingt einen zur sauberen Struktur weil man sonst
mit fehlermeldungen erschlagen wird
Also fangen wir mal an ...
Wie bei einem guten Buch sollte man ganz an den Anfang das Vorwort setzen.
Das sind einige Bemerkungszeilen in denen man schreibt was das Programm
eigentlich machen soll, wer es wann geschrieben hat und auf welchem
Prozessor es mit welchen Einstellungen (Fuses), Takt, ... laufen soll. Den
Namen des Programms (wenn es denn einen hat) sollte man auch nicht
vergessen. Das sieht in Assembler zB so aus ...
CodeBox ASM
Da hat aber jeder so seine Eigenheiten und eigenen Stil. Aber so im Großen
und Ganzen sollten diese Angaben vorhanden sein.
Danach kommen die Einstellungen für den Compiler. Also zB die Include-Datei
für den Prozessortyp (wenn man sie denn nicht schon im Vorwort eingebaut
hat). Auch die Clockrate gehört hier jetzt hin und auch alle weiteren
Einstellungen die nur für den Compiler da sind. Das ist bei Bascom zB dieser
Bereich ...
CodeBox BASCOM
Nun weiß der Mensch und auch der Compiler was das alles soll und womit
man es zu tun hat.
Bei der weiteren Vorgehensweise kann man sich jetzt etwas streiten was
man zuerst und was danach gemacht werden soll. Ich benutze da folgendes
Vorgehen ...
Jetzt kommen die Variablendeklarationen mit den Initial-Werten. Weil man die
evtl schon sehr früh im Programm benötigt. Wie schon vorher ein kleines
Beispiel (Bascom) ...
CodeBox BASCOM
Die Initialwerte sollte man auf keinen Fall vergessen weil die Variablen sonst
irgendwelche Zufallswerte beinhalten können. Man darf also bei der ersten
Benutzung einer Variablen nicht davon ausgehen das sie leer ist oder Null
enthält.
Jetzt würde ich im Anschluß die Portkonfiguration machen. Zuerst mal die
normalen Ports ...
CodeBox BASCOM
Zu dieser Portkonfiguration gehört natürlich auch die Beschreibung, was sich
an welchem Pin befindet. Also zB 1Wire-Bus, LCD, Taster, LED, ... und wie
der angeschlossene Pin der Pheripherie heißt (zB RS beim LCD).
Wenn die "normalen" Ports konfiguriert sind und wissen was sie zu tun
haben und ob sie Eingang oder Ausgang sind kann man an die "spezielleren"
Ports gehen. Das wären zB die LCD-Definitionen, 1Wire-Bus, RS232, ...
CodeBox BASCOM
Damit ist das gesamte System jetzt hardwaremäßig in einem Zustand das
jeder Pin weiß was er zu tun hat. Die Interrupts sollte man bei den speziellen
Ports allerdings erst kurz vor der Hauptschleife einschalten. Sonst hat man
in der Initialisierungsphase noch zuviel Wildwuchs mit den Unterbrechungen.
...
..
.
ich hab mal wieder nix anderes zu tun als ne neue FAQ zu schreiben
Also diesmal geht es darum, wie man ein Programm strukturiert und
systematisch aufbaut. Ich hab ja sxhon ein paar Programmiersprachen
hinter mir Aber die richtige Struktur von einem Programm hab ich damals
in Pascal gelernt. Das zwingt einen zur sauberen Struktur weil man sonst
mit fehlermeldungen erschlagen wird
Also fangen wir mal an ...
Wie bei einem guten Buch sollte man ganz an den Anfang das Vorwort setzen.
Das sind einige Bemerkungszeilen in denen man schreibt was das Programm
eigentlich machen soll, wer es wann geschrieben hat und auf welchem
Prozessor es mit welchen Einstellungen (Fuses), Takt, ... laufen soll. Den
Namen des Programms (wenn es denn einen hat) sollte man auch nicht
vergessen. Das sieht in Assembler zB so aus ...
CodeBox ASM
; -----------------------------------------
; ASCII-Keyboard mit LCD-Display (Terminal)
; LCD-Display Powertip PC1602-E (Pollin)
; mit ST7066U Controller an ATmega168-20PU
; mit 12MHz Quarz
; -----------------------------------------
;
;
;
; ===============================
; ========== ATtiny2313 =========
; ===============================
;
.include "tn2313def.inc" ;Definitionsdatei laden
;
;
;
; ----- FUSES -----
;
; * SUT1 und SUT0 (Zustand=11): Start-up Time 65ms nach Reset,
; Einstellung für Quarzoszillator und langsam ansteigende
; Betriebsspannung (Tabelle 5 des Datenblattes)
; * CKSEL3-CKSEL0 (Zustand=1111): Quarzoszillator im Bereich 3-8MHz
; (Tabelle 4 des Datenblattes)
; * CKOPT (Zustand=1): schneller Quarzoszillator (Tabelle 4 des Datenblattes)
; * BODEN (Zustand=0): Brown-out einschalten
; * BODLEVEL (Zustand=1): Brown-out Schwelle auf 2,7V setzen
;
; Unter Beachtung der invertierten Logik der Fuse-Bits sollte man
; also die Fuses so setzen wie im folgenden Bild:
;
; ( )7 ( )6 ( )5 ( )4 ( )3 ( )2 [ ]Lock2 [ ]Lock1
;
; ( )7 ( )6 ( )5 ( )4 ( )3 ( )2 ( )1 [ ]SPMEN
;
; [ ]DWEN [ ]EESAVE (X)SPIEN [ ]WDTON [ ]BODLEVEL2 [ ]BODLEVEL1 [ ]BODLEVEL0 ( )RSTDISBL
;
; [X]CKDIV8 [ ]CKOUT [ ]SUT1 [X]SUT0 [X]CKSEL3 [ ]CKSEL2 [X]CKSEL1 [X]CKSEL0
; ______________________
; | |
; | [X] Bit=0 [ ] Bit=1 | ( ) -> Nicht anwaehlbar [ ] -> Anwaehlbar
; | progr. unprogr. |
; |______________________|
;
;
;
; ----- PINS -----
;
; ATMEL AVR ATtiny2313
; 2kByte Flash (1kx16)
; 128Byte EEPROM
; 32 Register + 128Byte RAM
;
; ATtiny2313
; +------------------------------------------+
; (ISP) RESET --| 1 PA2(Reset/dW) VCC 20|-- +Vcc
; | 2 PD0(RXD) (UCSK/SCL/PCINT7)PB7 19|-- SCK (ISP)
; | 3 PD1(TXD) (MISO/DO/PCINT6)PB6 18|-- MISO (ISP)
; XTAL --| 4 PA1(XTAL2) (MOSI/DI/SDA/PCINT5)PB5 17|-- MOSI (ISP)
; XTAL --| 5 PA0(XTAL1) (OC1B/PCINT4)PB4 16|
; | 6 PD2(CKOUT/XCK/INT0) (OC1A/PCINT3)PB3 15|
; | 7 PD3(INT1) (OC0A/PCINT2)PB2 14|
; | 8 PD4(T0) (AIN1/PCINT1)PB1 13|
; | 9 PD5(T1/OC0B) (AIN0/PCINT0)PB0 12|
; GND --|10 GND (ICP)PD6 11|
; +------------------------------------------+
; (*) 100nF nach GND
;
Da hat aber jeder so seine Eigenheiten und eigenen Stil. Aber so im Großen
und Ganzen sollten diese Angaben vorhanden sein.
Danach kommen die Einstellungen für den Compiler. Also zB die Include-Datei
für den Prozessortyp (wenn man sie denn nicht schon im Vorwort eingebaut
hat). Auch die Clockrate gehört hier jetzt hin und auch alle weiteren
Einstellungen die nur für den Compiler da sind. Das ist bei Bascom zB dieser
Bereich ...
CodeBox BASCOM
' #############################################################################
' ##### Definitionen ##########################################################
' #############################################################################
' Prozessor ATmega8535 (lag grade so rum)
' 8k Flash, 512Byte SRAM, 512Byte EEPROM
$regfile = "m8535.dat"
' 16MHz Quarztakt
$crystal = 16000000
' Hab ich abgekupfert ;-)
$hwstack = 32
$swstack = 10
$framesize = 40
Nun weiß der Mensch und auch der Compiler was das alles soll und womit
man es zu tun hat.
Bei der weiteren Vorgehensweise kann man sich jetzt etwas streiten was
man zuerst und was danach gemacht werden soll. Ich benutze da folgendes
Vorgehen ...
Jetzt kommen die Variablendeklarationen mit den Initial-Werten. Weil man die
evtl schon sehr früh im Programm benötigt. Wie schon vorher ein kleines
Beispiel (Bascom) ...
CodeBox BASCOM
' #############################################################################
' ##### Variablen #############################################################
' #############################################################################
' Was Byte-mässiges
Dim A As Byte
A = 1
Dim B As Integer
B = 0
Dim B_alt As Integer
B_alt = B
Die Initialwerte sollte man auf keinen Fall vergessen weil die Variablen sonst
irgendwelche Zufallswerte beinhalten können. Man darf also bei der ersten
Benutzung einer Variablen nicht davon ausgehen das sie leer ist oder Null
enthält.
Jetzt würde ich im Anschluß die Portkonfiguration machen. Zuerst mal die
normalen Ports ...
CodeBox BASCOM
' #############################################################################
' ##### Initialisierung #######################################################
' #############################################################################
' ==============================================
' Die Ports auf dem Eval-Board und ihre Belegung
' ==============================================
' DDRx => Datenrichtung des Portpins
' 0=Eingang , 1=Ausgang
' PORTx => Ausgang oder PullUp
' 0=GND/PullUp aus , 1=Vcc/PullUp an
' PINx => Eingang (Pin abfragen)
' === PortA ============================
' PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
' - - - - - - - -
' Alle Portbits können verwendet werden
Ddra = &B1111_1111
Porta = &B0000_0000
' ======================================
Zu dieser Portkonfiguration gehört natürlich auch die Beschreibung, was sich
an welchem Pin befindet. Also zB 1Wire-Bus, LCD, Taster, LED, ... und wie
der angeschlossene Pin der Pheripherie heißt (zB RS beim LCD).
Wenn die "normalen" Ports konfiguriert sind und wissen was sie zu tun
haben und ob sie Eingang oder Ausgang sind kann man an die "spezielleren"
Ports gehen. Das wären zB die LCD-Definitionen, 1Wire-Bus, RS232, ...
CodeBox BASCOM
' ======================================
' === LCD-Initialisierung ==============
' ======================================
' Umschaltbyte für Anzeige : 0 = Chip 1 / 1 = Chip 2
Dim ___lcdno As Byte
' with the config lcdpin statement you can override the compiler settings
Config Lcd = 40 * 4
' LCD an PORT-A läuft auch !
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.1 , Db6 = Porta.2 , Db7 = Porta.3 , E = Porta.4 , E2 = Porta.5 , Rs = Porta.6
Config Lcdbus = 4
' === oberen Chip 1 einschalten und initialisieren ===
___lcdno = 0
Initlcd
Cls
' === unteren Chip 2 einschalten und initialisieren ===
___lcdno = 1
Initlcd
Cls
' ======================================
' ======================================
' ======================================
Damit ist das gesamte System jetzt hardwaremäßig in einem Zustand das
jeder Pin weiß was er zu tun hat. Die Interrupts sollte man bei den speziellen
Ports allerdings erst kurz vor der Hauptschleife einschalten. Sonst hat man
in der Initialisierungsphase noch zuviel Wildwuchs mit den Unterbrechungen.
...
..
.