Hallo, ich habe eine Frage zu dem AT90PWM2/3 der das DALI Protokoll beherrschen soll. Heißt das nun das der Microkontroller direkt ein Steuersignal für ein Dali-EVG erzeugen kann? Leider werde ich nicht daraus schlau wenn es heißt das der Kontroller das Dali-Protokoll unterstützt.
Hi Hab zwar noch nicht mit dem PWM2/3 gearbeitet (dafür schon mit DALI) aber was ich gesehen habe erzeugt der Controller (sofern richtig konfiguriert) grundsätzlich schon ein richtiges DALI Signal (also 16Bit Frame, bi-phase) - nur halt auf Logikpegel (so wie ein normaler Uart auch, wo du dann noch z.B. einen MAX232 dranhängst um RS232 Pegel zu haben). Um EVG's anhängen zu können brauchts also noch ein wenig Außenbeschaltung. Hier gibts einige Aplikationnotes dazu (google mal ein wenig dann findest du sicher was - "dali schematic" z.b.). Unsere Lösung in der Firma besteht im wesentlichen aus 2 Optokopplern, 4 Dioden, 1 Z-Diode, 1 Transistor und 2 Widerständen. Beachte aber das du auch noch ein Dali-Netzteil benötigst welches den Bus entsprechend versorgt. MfG Oli
Hallo, ich arbeite zur Zeit an einem Projekt an der HTL, ebenfalls mit einem AT90PWM2. Jedoch ist es mir noch nicht gelungen, den µC richtig zu konfigurieren. Hat es bei dir geklappt? Wenn ja, könntest du mal den Programm-Code posten? Es wäre nett, wenn sich sonst noch jemand melden würde, der Ahnung von dem Thema hat. mfg Daniel
>Jedoch ist es mir noch nicht gelungen, den µC richtig zu >konfigurieren. Sehr weitläufige Beschreibung des Problems... Was genau will denn nicht funktionieren? Welche Revision hast Du von dem Teil? Die Erste Serie A oder schon ein B? Die A hatte auch noch ein paar nette Bugs bzw. ein paar Kleinigkeiten, auf die man achten muss!
Ich versuche ein DALI-Frame zu schicken mit 16 Bit, jedoch kommen nur die ersten 8 richtig an, die anderen 8 haben für mich keine Logik. Das Bit-Muster sieht fast immer gleich aus. Ich benutze den AT90PWM2B Ich poste mal mein Programmcode und das Ausgangssignal: #include "io.h" #include <avr/interrupt.h> #include "signal.h" #include <util/delay.h> void EUSART_Transmit_data( unsigned int data ) { // Wartet, bis Transmit lehr ist while ( !( UCSRA & (1<<UDRE))) //Die datei wird in den Buffer geladen und dann gesendet EUDR = data>>8; UDR = data; } int main (void) { //UCSRA = ; UBRRL = 50; //Setzt Baudrate des Transmitters auf 1200; UCSRC = 0b00001000; //Setzt die Stop-Bits auf 2; MUBRR = 833; //Setzt Baudrate des reveivers auf 1200 und Frequenz auf 1MHz EUCSRA = 0b10110111; //Hier wird die Anzahl der zu senden Bits eingestellt (16) EUCSRB = 0b00011010; //EUSART-Mode wird eingeschaltet UCSRB = 0b00011000; //EUSART Transmitter wird eingeschaltet unsigned int data = 0b1010100101111001; //unsigned int data = 0b1001111010010101; EUSART_Transmit_data(data); while(1) { } } Wie man im Bild sehen kann, sind die ersten 8 Bit richtig, die anderen nicht mehr. Es sollte eigentlich gleich aussehen, wie das Bsp. im Datenblatt des µC. vielen Dank für die Hilfe! mfg Daniel
Weiß niemand was ich falsch mache? Was muss ich den beachten Matthias? mfg Daniel
Da ist ein Fehler.... void EUSART_Transmit_data( unsigned int data ) { // Wartet, bis Transmit lehr ist while ( !( UCSRA & (1<<UDRE))) { }; //Die datei wird in den Buffer geladen und dann gesendet EUDR = data>>8; UDR = data; }
Sollte es mit diesem Code funktionieren? Es erscheint mir ein bisschen komisch, dass dieser Teil falsch sein soll, weil es eigentlich direkt aus dem Datenblatt genommen wurde. Werde es aber trotzdem mal ausprobieren.
Also dafinitv wartet die erste Version nicht bis der Puffer leer ist, sondern schiebt permanent die Daten un EUDR. Es fehlen die Blockklammern, oder ein simples Semikolon. while ( !( UCSRA & (1<<UDRE))) //Die datei wird in den Buffer geladen und dann gesendet EUDR = data>>8; Des weiteren würde Ich jedoch empfehlen die verwendete Schaltung auf Standardkonformität - insbesonere im Punkt "Flankensteilheit" - zu Prüfen.
Danke Gast12345 und Willi71, die Klammern waren schuld. Habs jetzt so gemacht, wie ihr es mir geschrieben habt und jetzt gehts. Vielen Dank!!!
Hallo Daniel, hab das gleich problem was du hast. bin zur zeit auch am probieren. las uns mal die mail tauschen um besser sich auszutauschen
Hallo Experte, hab eine Frage zu dem Register warum steht da die 50 und das andere Register UBRRH nichts? kann mir jemand das beantworten. Danke UBRRL = 50; //Setzt Baudrate des Transmitters auf 1200;
An alle Profis hier, hab den Code mit dem gleichen at90pwm216, versucht grad zu übernehmen und an max232 zu übertragen. zeigt natürlich nichts an. wer weis warum nicht?
Tut mir leid für die späte Antwort. Auf das UBRRL-Register bin ich durch probieren drauf gekommen. An Mathes: Hast du konrolliert, ob die Register auch in deinem µC vorhanden sind? Ich habe bei den meisten Register ein Kommentar dazugeschrieben, vergleich mal im Dattenblatt, ob die Funktionen übereinstimmen. Kannst du den Code ohne Fehler kompelieren? mfg Daniel
ja hab ich, benutze aber ein EXternen Quartz 4 MHz, benutze den at90pwm216 auf dem stk520 bord. die register sind die gleichen. hatte auch so gemacht befor ich dein code gesehen hab. es funkts bis heut nicht. was mich noch verwundert ist das die dali klem. auf dem stk520 nur eine span. von 5 volt hat und der dali benötigt doch viel höchere spannung für transmit.
Du bekommst keine Fehlermeldungen beim compelieren und keine Fehler beim Programmieren des µC's? Probier mal einfach einen Port immer wieder zu toggeln, in dem du eine while-Schleife benutzt, um zu sehen, ob der Port das macht, was du ihm programiert hast. mfg Daniel
hallo, die while steht bei mit in der main() while(1) { EUSART_Transmit(s); } nur wenn ich den baten neben con. drück und zwar den write flash memory findet die übertragung stat, sonst nicht. das ist auch nicht normal. hast du bei deinem dali code die Interrupts auch benutzt?
Daniel ich hab heut den register sogar auf 8 bit in senderichtung umgestellt, er sendet aber viel mehr bits als die 8. warum, was mache ich falsch? mfg mathes
Ich habe als erstes auch den STK500 verwendet, da hat die Programmierung nur bis ca. zur hälfte geklappt. Jetzt verwende ich den AVR-Dragon, mit dem geht es ohne Probleme. Post mal deinen Code, vielleicht seh ich da was falsches. Ich hab keine Interrupts verwendet, immer mit dem Reset den µC geresetet. mfg Daniel
Ich verwende stk500 und oben drauf den stk520 für den at90pwm216. Hab dein code übernommen außer in der main funktion die werte: UBRRL = 207; //hab 4 MHz extern Quarz MUBRR = 833; es kann bestimmt noch an den Fuse Bits liegen, laut datenblatt muss Register CKSEL3..0 1111-1110 haben. wenn ich Con. kommt da so ein Fenster mit Fuse Bits. da gibts das register nicht :-) hast vieleicht eine idee?
Ja das kann sein, dass etwas mit den Fuses nicht stimmt. Mit einem Fuse kann man einstellen, was für ein Quarz man hat (extern oder intern). Kann dir leider aber grad nicht nachschauen. Ich kann dir aber morgen nachschauen, wie das Fuse bei mir heißt. mfg Daniel
Ich denke ich habs, muss morgen mit einem Oszi nachschauen was ich da Sende. Hab den Exter Quarz von 4MHz und Eingestellt von 3 -8 MHz
Hallo Daniel, meine Bits sind ok, jetz sofort die nächste frage. wie hast du den DALI Bus mit spannung versorgt? wenn du in besitz einer schaltung bist kannst du die mal hier posten. mfg mathes
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.