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
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
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.)
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.