Dies ist eine alte Version des Dokuments!
Skript
Bildschirmlupe an!
SW2 Hello Display World - fast Counter
- Wdh. Hello Blinking World:
DDRx
,PORTx
,_Delay_ms()
-->R
steht fast immer für Register- --> einmal kompilieren und in Simulide aufbauen
- Welche „Vorgaben für die SW-Entwicklung“ wurden verletzt? --> Keine magic numbers, sondern #defines !
siehe Weiterführende Fragen und Infos
- Heute „Hello World“ in echt! Timer + Displayausgabe
- „Kapitel 2 Sound und Timer bitte nachträglich anschauen“
- Frage an Studis „Wer weiß nicht was PWM ist?“
In MC Studio
- neues Projekt
02_timer
- jetzt neu: mit Display!
- --> Bibliothek aus wiki herunterladen!
- Project --> Add --> existing Item (NICHT drag & drop)
- bei mir --> F2 Namen ändern auf
lcd_lib_de.h
- Split Screen
- Was tun, um Lib in main einzufügen?
#include
!#inc
+ <Tab>- --> Unterschied
<lib.h>
vs"lib.h"
- Durchsicht der
lcd_lib_de.h
F_CPU
- --> CPU Frequenz, wichting für genaues Timing der delays
- hier
18,432 MHz
--> Minimexle Frequenz - Warum
18'432'000 Hz
?- ILIAS --> Elektronik Labor --> MiniMEXLE Schaltbild
- „Schreck!“ sowiel Krams auf dem Schaltplan!
- Wo ist der Quarz? Quarz schwingt mechanisch im E-Feld --> Schaut im Bild aus wie ein Kondensator
- defines --> keine Magic numbers
- Funktionsprotoypen --> bitte immer am anfan angeben --> gut für eine Übersicht
- als erstes immer Initialisierung (anlegen der Variablen, verschiedene Konfigurationen etc.)
lcd_i
+ <tab>- schon mal kompilieren (immer mal kompilieren zum test, ob noch alles klappt)
- noch nicht lauffähig, da nichts angezeigt !
- einen String ausgeben!
- welche Unterfunktion wohl geeignet?
- Hinweis auf Inkonsistenz bei Namensgebung
- Eingabe
lcd_displayMessage("Hallo!", 0,0 )
--> Hinweis auf Zählanfang 0 nicht 1!
- Flashen auf Minimexle
- Add Target --> STK500 --> ersten COM Port auswählen (und - falls es nicht passt - den nächsten)
- Tools --> Device Programming
- Apply --> Device Signature sichtbar?
- --> Memories --> Program
- Ausgabe von
Hallo! Zähler:
- kann
ä
nicht schreiben , sondern schreibtµ
, warum?- --> Datasheet lesen!
- Am besten in der Schaltung den Namen suchen
- Googeln nach DEM16216 Datasheet --> Datenblatt etwas kurz? Blockdiagramm (immer schön Bilder in eigene Dokus machen!) --> ST7066U!
- Googeln nach ST7066U Datasheet
- Kurzes darüberscrollen über das Datasheet
- --> Character code Table! --> ist da
ä
drin? In einer schon… In der anderen isµ
beim gleichen Bitmuster - Also: was tun? entweder
á
nutzen, oderldc_putc(11100001);
--> was wurde vergessen? -->%
!
- Vergleich in Simulide:
- Aufbau der Schaltung: mega88 + Hd44780 (ist kompatibel zu ST7066U)
- Wie verbinden? Siehe lib (wenn gut beschrieben) oder MEXLE Schaltung
- In lib: Port-Bits.
PIN_EN
,PIN_RS
--> wo in Simulide? - Für was steht
EN
? --> Enable.RS
--> Register Select PORT_DATA
: vonPORTC
nur die ersten 4 bits (0…3)- in Simulide
18,432 MHz
eingeben! - hex file Flashen
- --> animation einschalten (High/Low wird angezeigt)
- es wird noch nichts ausgegeben?? --> im Code schauen oder im Schaltplan!
PC0
aufD4
,PC1
aufD5
,PC2
aufD6
,PC3
aufD7
- jetzt klappts, aber
ä
an falscher Position
lcd_gotoxy
einfügen- In Simulide autoload einschalten!
Jetzt: aufsteigende Zahlen ausgeben Was tun?
- Laufvariable anlegen und nutzen:
uint8_t i=0;
undi++
in der Schleife - wie gibt man Zahlen aus?
sprintf
? (kann in String einen Zahlenwert ausgeben) sprintf(output_str, "i:%03u", i);
3
--> drei Dezimalstellen,u
--> unsignedoutput_str
deklarieren- kompilieren -->
#include <stdio.h>
vergessen - Simulation herunterdrehen
aktuell zählt er nicht so schnell wie die CPU kann, sondern so schnell wie er es ausgeben kann. Die CPU kann aber schneller!
- Blick ins Datenblatt des atmega88
- Blockbild des atmega
- T/C im Inhaltsverzeichnis --> 16 bit Timer/Counter
- wieder Blockbild, diesmal vom Timer / Counter
- wichtig sind immer die Register
TCNTn
--> timer Counter ; für was stehtn
? in Mathe?OCRnA
--> Output Compare („Wert zum gegen-checken“)TCCRnA
--> für was steht TC? Timer Counter! Für was R? Register! --> hier neu: C für control
- Zeilen mit
sprintf
undlcd_displayMessage
kopieren - diesmal:
sprintf(output_str, "TC:%03u", TCNT1);
--> an zweiter Pos ausgeben. --> wichtig:3
in5
ändern!- kompilieren und in Simulide starten
- TC zählt noch nicht!
- siehe Blockdiagramm: Control logic --> steht im folgenden in der Register Description
- Blick in die Tabellen, was bei Initialisierung des uC mit 0 passiert \\Speziell die Register description!
- bei vielen ergibt
0
normal operation - aber bei CS (clock select) bedeutet
000
= keine Clock. Da kommt nix raus! - also
CS10
setzen für schnellsten Zähler TCCR1B |= 1<<CS10
;
- jetzt zählt der Zähle echt schnell. Schneller als die Anzeige!