Forum: Mikrocontroller und Digitale Elektronik Atmega16 Programmierung


von Glückskeks (Gast)


Lesenswert?

Hey Leute..

ich sitze gerade zu Hause und wollte mit meinem Pollin-Board bzw. Atmega 
16 arbeiten. Ich hab mir das Ding vor ca. einen Monat geholt und möchte 
mich in die Welt des Mikrocontrollers einführen. Bis jetzt hat das ganze 
gut geklappt, aber jetzt habe ich mir eine Aufgabe im Internt gesucht 
und bin gescheitert. Es wäre nett, wenn mir jemad für die Lösung einen 
Tipp oder einen Anfangsversuche geben könnte.

Hier die Aufgabe:
Entwickeln Sie ein Programm für den ATmega16, das folgendes ausführt. 
Ein Summer mit der Frequenz
von etwa 2kHz soll alle 500ms ein und ausgeschaltet werden.

Mit freundlichen Grüßen
Glückskeks

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Glückskeks schrieb:
> Hier die Aufgabe:
> Entwickeln Sie ein Programm für den ATmega16, das folgendes ausführt.
> Ein Summer mit der Frequenz
> von etwa 2kHz soll alle 500ms ein und ausgeschaltet werden.

> aber jetzt habe ich mir eine Aufgabe im Internt gesucht

Dann müssten wir ja die Aufgabe auch im Netz finden können. Google 
findet aber nix.

> und bin gescheitert. Es wäre nett, wenn mir jemad für die Lösung einen
> Tipp oder einen Anfangsversuche geben könnte.

Zeigst du uns mal den Link auf die Seite mit der Aufgabe? Oder sollen 
wir deine Hausaufgaben erledigen?  =)

Gruß,
Magnetus

von Karl H. (kbuchegg)


Lesenswert?

Glückskeks schrieb:

> Hier die Aufgabe:
> Entwickeln Sie ein Programm für den ATmega16, das folgendes ausführt.
> Ein Summer mit der Frequenz
> von etwa 2kHz soll alle 500ms ein und ausgeschaltet werden.

Welche Teile davon kannst du alleine lösen.

Wenn man die Aufgabe vereinfacht zu
'Ein Summer soll mit 2kHz summen', kannst du das dann lösen und wie 
machst du das?


(Die letzte Frage habe ich gestellt um zu erfahren, wie weit du mit 
deinen Studien bist. Bist du noch ein _delay Typ oder hast du 
mitlerweile die Timer entdeckt.)

von Drehwurm (Gast)


Lesenswert?

Glückskeks schrieb:
> Entwickeln Sie ein Programm für den ATmega16, das folgendes ausführt.
> Ein Summer mit der Frequenz
> von etwa 2kHz soll alle 500ms ein und ausgeschaltet werden.
1
while (1) {
2
  summer_an();
3
  _delay_ms(500);
4
  summer_aus();
5
  _delay_ms(500);
6
}

die Implementierung von summer_an() und summer_aus() hängt von deinem 
Summer ab. Wenn dieser seine 2KHz selbst erzeugt (es also ein echter 
Summer ist), einfach Portpin an/abschalten.
Wenn es nur ein Lautsprecher ist: 2KHz PWM an/abschalten. Bzw. PWM 
durchlaufen lassen, nur den Portpin als Ausgang oder Eingang schalten.

von Glückskeks (Gast)


Lesenswert?

Ja, also mein Problem liegt eher darin mit dieser 500ms Pause. Ich habe 
bereits ein Programm von einem Timer. Dieser funktioniert auch, aber 
wenn ich diese Sache mit hinein bringen möchte, dann scheitert es bei 
mir.

Hier ist das Programm vom Summer:
.nolist
.include "m16def.inc"
.list

.cseg             ;Beginn des Programms
.org 0000
              ;Symbolvereinbarung
.EQU Summer = PORTD7
.EQU IO_OUT = PORTD
.EQU IO_DDR = DDRD
.EQU IO_IN = PIND
.EQU TASTE1 = PIND2
.EQU Takt=4000000
.DEF LR=R16
.DEF t=R17
.EQU T_2=100
Start:
  LDI LR, 0b11100010 ;
  OUT IO_DDR, LR
Schleife:
  CLR t
  CBI IO_OUT, Summer     ;Summer aus Taktzyklen (cycle)1

Aus_1:
  INC t           ;t=t+1 1
  CPI t, T_2         ; 1
  BRLO Aus_1         ;Springe bei kleiner 2 (Wenn kleiner), 1 (Wenn 
nicht kleiner)
  SBIC PIND, TASTE1    ;Springe bei kleiner 2 (Drücken=AN, nicht 
Drücken=AUS
  SBI IO_OUT, Summer     ;Summer ein
  CLR t           ;t=0
Ein_1:
  INC t           ;t=t+1
  CPI t, T_2
  BRLO Ein_1         ;Springe bei kleiner
  RJMP Schleife       ;Neuanfang

von Karl H. (kbuchegg)


Lesenswert?

Glückskeks schrieb:
> Ja, also mein Problem liegt eher darin mit dieser 500ms Pause. Ich habe
> bereits ein Programm von einem Timer.

Das glaub ich nicht, Tim.
Dein Programm ist ein klassisches Warteschleifen Verfahren.
Zeiten werden dadurch definiert, dass eine bekannte Anzahl Berechnungen 
entsprechend oft wiederholt wird.

Das kannst du natürlich auch dann machen, wenn sich am Ausgabepin ganz 
einfach nichts tut. Machst du genügend Wiederholungen, dann hast du 
irgendwann 0.5 Sekunden beisammen.

von Glückskeks (Gast)


Lesenswert?

Ich weiß nicht so genau ob ich dann zu meinem Ziel komme.

AIch muss diese Dinge ja Initialisieren.

Ausgang setzen --Y DDRD=ob11100000
Stack --> SP = RAMEND
Timer --> TCCRO = 0b00000011
           TCNTO = 255-62
Interrupt freigeben TIMSK = 0b000000011
                            SEI
Schleife = RJMP Schleife

von Karl H. (kbuchegg)


Lesenswert?

Glückskeks schrieb:
> Ich weiß nicht so genau ob ich dann zu meinem Ziel komme.
>
> AIch muss diese Dinge ja Initialisieren.

Moment.
Du solltest dich jetzt erst mal mit dir selbst auf eine grundsätzliche 
Vorgehensweise einigen.
Entweder du machst weiterhin Warteschleifen (und zum gegenwärtigen 
Zeitpunkt spricht erst mal nichts dagegen)
oder du gehst an die Timerhardware

> Ausgang setzen --Y DDRD=ob11100000
> Stack --> SP = RAMEND
> Timer --> TCCRO = 0b00000011
>            TCNTO = 255-62
> Interrupt freigeben TIMSK = 0b000000011
>                             SEI
> Schleife = RJMP Schleife

Bleib zunächst bei Warteschleifen. Zuviel auf einmal zu verändern bringt 
nichts. Wenn du dein Programm verstanden hast, dann dürfte es für dich 
kein Problem sein, da auch noch 0.5 Sekunden Pause einzubauen.

AVR-Tutorial

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.