Dies ist eine alte Version des Dokuments!
Skript
Bildschirmlupe an!
SW2 Hello Display World - fast Counter
- Wdh. Hello Blinking World:
DDRx,PORTx,_Delay_ms()-->Rsteht 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.hF_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: vonPORTCnur die ersten 4 bits (0…3)- in Simulide
18,432 MHzeingeben! - hex file Flashen
- --> animation einschalten (High/Low wird angezeigt)
- es wird noch nichts ausgegeben?? --> im Code schauen oder im Schaltplan!
PC0aufD4,PC1aufD5,PC2aufD6,PC3aufD7- jetzt klappts, aber
äan falscher Position
lcd_gotoxyeinfü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_strdeklarieren- 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
sprintfundlcd_displayMessagekopieren - diesmal:
sprintf(output_str, "TC:%03u", TCNT1);--> an zweiter Pos ausgeben. --> wichtig:3in5ä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
0normal operation - aber bei CS (clock select) bedeutet
000= keine Clock. Da kommt nix raus! - also
CS10setzen für schnellsten Zähler TCCR1B |= 1<<CS10;
- jetzt zählt der Zähle echt schnell. Schneller als die Anzeige!