www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 Programmierung


Autor: Glückskeks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Drehwurm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
while (1) {
  summer_an();
  _delay_ms(500);
  summer_aus();
  _delay_ms(500);
}

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.

Autor: Glückskeks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Glückskeks (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.