Naja, Du hast ja auch Deine Spezialgebiete...Leute, ihr seid
korrekt, allerdings würde der so bei jeder Flanke inkrementieren. Wären also acht Perioden. Da man den Counter auch beschreiben kann, könnte man alle fünf Perioden auf das Flag reagieren/'n IRQ Triggern lassen, das wären dann die geforderten f/10000. f/20000 wären dann in reiner SW mitzuerledigen.Bei 'ner USI hat man Zugriff auf den 4bit-Zähler, wenn ich mich recht erinner.
leider auch korrekt, wenn Du keinen AVR mit USART, drei Timern mit je zwei nutzbaren PWM und USI findest (und nebenbei die genannten Funktionen nicht um die Beine konkurrieren), wäre der Rest in Software anzugehen.leider mit'ner richtigen SPI nicht geht
Quark... man schreibt einfach regelmäßig was in's UDR - war das UDR vorher leer, steht jetzt was drin; wenn nicht, wird das schreiben ignoriert. Wenn man das alle sieben Takte oder so macht steht immer was im UDR.Oder man pollt auch die USART (das hopsen dauert ja länger als pollen und UDR beschreiben) regelmäßig
Nana...Auf deine Ideen wie du es jetzt schon erfolgreich umgesetzt hast wäre ich wohl nie gekommen
Es sind ja auch eben diese Tricks die ich meineNana...
//ATmega88 .def count=r17 rjmp init .org OC1Aaddr subi count, 1 brne done ldi count, 5 sbi PINB, PB4 sbic PINB, PB4 sbi PINB, PB5 done: reti init: //Outputs // XCK TXD OC0A OC0B OC2B ldi r16, (1<<PD4)|(1<<PD1)|(1<<PD6)|(1<<PD5)|(1<<PD3) out DDRD, r16 // OC2A OC1A OC1B ldi r16, (1<<PB3)|(1<<PB1)|(1<<PB2)|(1<<PB4)|(1<<PB5) out DDRb, r16 //Timer syncronisation ldi r16, (1<<TSM)|(1<<PSRASY)|(1<<PSRSYNC) out GTCCR, r16 //Timer0 //OC0B generates F/10 ldi r16, 4 out OCR0B, r16 //OC0A generates f/20 ldi r16, 9 out OCR0A, r16 // fast PWM - OC0A toggle, OC0B PWM ldi r16, (1<<COM0A0)|(1<<COM0B1)|(1<<WGM01)|(1<<WGM00) out TCCR0A, r16 // fastPWM, prescaler=1 start ldi r16, (1<<WGM02)|(1<<CS00) out TCCR0B, r16 //Timer2 //OC2B generates F/100 ldi r16, 49 sts OCR2B, r16 //OC2A generates f/200 ldi r16, 99 sts OCR2A, r16 // fast PWM - OC2A toggle, OC2B PWM ldi r16, (1<<COM2A0)|(1<<COM2B1)|(1<<WGM21)|(1<<WGM20) sts TCCR2A, r16 // fastPWM, prescaler=1 start ldi r16, (1<<WGM22)|(1<<CS20) sts TCCR2B, r16 //Timer1 //OC1B generates F/1000 ldi r16, high(499) sts OCR1BH, r16 ldi r16, low(499) sts OCR1BL, r16 //OC1A generates f/2000 ldi r16, high(999) sts OCR1AH, r16 ldi r16, low(999) sts OCR1AL, r16 // fast PWM - OC1A toggle, OC1B PWM ldi r16, (1<<COM1A0)|(1<<COM1B1)|(1<<WGM11)|(1<<WGM10) sts TCCR1A, r16 ldi r16, (1<<OCIE1A) sts TIMSK1, r16 //<--IRQ // fastPWM, prescaler=1 start ldi r16, (1<<WGM13)|(1<<WGM12)|(1<<CS10) sts TCCR1B, r16 //USART XCK0 generates f/2 ldi r16, (1<<TXEN0) sts UCSR0B, r16 ldi r16, (1<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00) sts UCSR0C, r16 ldi r16, 0 sts UBRR0L, r16 out GTCCR, r16 //Timer syncronisation ldi count, 5 //<-- SW-Counter preload //ready sei loop: sts UDR0, r16 rjmp loop
// *************** Bugfixing tn2313Adef.inc **************** .equ UMSEL0 = 6 ; USART Mode Select Bit 0 .equ UMSEL1 = 7 ; USART Mode Select Bit 1 // ********************************************************* //ATtiny2313A .def count=r17 .def USIcntReload=r18 rjmp init .org USI_OVFaddr out USISR, USIcntReload//<- IRQ each 5. edge, Flag clear sbi PINB, PB5 //toggle each edge sbic PINB, PB5 rjmp done //toggle each period sbi PINB, PB6 subi count, 1 //each fifth brne done ldi count, 5 sbi PINB, PB0 //toggle sbic PINB, PB0 sbi PINB, PB1 //...period done: reti init: //Outputs // OC0B XCK ldi r16, (1<<PD5)|(1<<PD2) out DDRD, r16 // f/2000 f/1000 OC1B OC1A OC0A f/20000 f/10000 ldi r16, (1<<PB6)|(1<<PB5)|(1<<PB4)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0) out DDRb, r16 //USI ldi r16, (1<<USIOIE)|(1<<USICS1) out USICR, r16 //each edge increments USI-conter, IRQ enabled ldi USIcntReload, (1<<USIOIF)|11 //Preload, Overflow-Flag has to be cleared manually out USISR, USIcntReload //<- IRQ each 5 edges //Timer0 //OC0B generates F/10 ldi r16, 4 out OCR0B, r16 //OC0A generates f/20 ldi r16, 9 out OCR0A, r16 // fast PWM - OC0A toggle, OC0B PWM ldi r16, (1<<COM0A0)|(1<<COM0B1)|(1<<WGM01)|(1<<WGM00) out TCCR0A, r16 // fastPWM, prescaler=1 start ldi r16, (1<<WGM02)|(1<<CS00) out TCCR0B, r16 //Timer1 //OC1B generates F/100 ldi r16, high(49) out OCR1BH, r16 ldi r16, low(49) out OCR1BL, r16 //OC1A generates f/200 ldi r16, low(99) out OCR1AL, r16 // fast PWM - OC1A toggle, OC1B PWM ldi r16, (1<<COM1A0)|(1<<COM1B1)|(1<<WGM11)|(1<<WGM10) out TCCR1A, r16 // fastPWM, prescaler=1 start ldi r16, (1<<WGM13)|(1<<WGM12)|(1<<CS10) out TCCR1B, r16 //USART XCK0 generates f/2 ldi r16, (1<<TXEN)|(1<<UCSZ2) out UCSRB, r16 ldi r16, (1<<UMSEL0)|(1<<UCSZ1)|(1<<UCSZ0) out UCSRC, r16 ldi r16, 0 out UBRRL, r16 ldi count, 5 //<-- SW-Counter preload //ready sei loop: rjmp loop
Das Tx-Signal paßt schon irgendwie - das ist nur kein "normaler" UART-Output - sieht irgendwie ... ähm ... "Flankenverschränkt" ... aus. @dino03 ?? In den Datenblättern wird der USART nur sehr stiefmütterlich behandelt. Hab jetzt weder nach AppNotes gesucht, noch meinen Output näher analysiert. Würde Thomas hier eh nicht weiterhelfen."Trick 17" - SCK des asynchronen USART mit UBRR=0. Das an Tx ausgegebene Byte scheint dabei irgendwie geschrottet zu werden
Ich fahr denn mal los, am WE wird rum probiertSehr geehrter Herr BAUMANN,
Vielen Dank für Ihre Bestellung. Wir werden diese schnellstmöglich prüfen und bearbeiten.
// *************** Bugfixing tn2313Adef.inc **************** .INCLUDE <tn2313Adef.inc> .EQU UMSEL0 = 6 ; USART Mode Select Bit 0 .EQU UMSEL1 = 7 ; USART Mode Select Bit 1 // ********************************************************* // Project: ClockDividor // ¯¯¯¯¯¯¯¯ // Description: The system clock gets devided into several frequencies. // ¯¯¯¯¯¯¯¯¯¯¯¯ See wireing for details. // A crystal oszillator (18MHz) is required on pin 5. // // Device: ATtiny2313A // ¯¯¯¯¯¯¯ // Fuses: 0x## 0x## 0x## 0x## // ¯¯¯¯¯¯ // By: LotadaC (makerconnect.de) // ¯¯¯ tightDev.Net (just a bit markup) // // Wireing: // ¯¯¯¯¯¯¯¯ _____ _____ // | V | // (ISP Reset/dW) | 1 20 | VCC (5V) // nc | 2 19 | (ISP SCK) // nc | 3 18 | PB6 (=f/2000), (ISP MISO) // nc | 4 17 | PB5 (=f/1000), (ISP MOSI) // XTAL1 (18MHz) | 5 16 | OC1B (=f/100) // XCK0?? (=f/2) | 6 15 | OC1A (=f/200) // nc | 7 14 | OC0A (=f/20) // nc | 8 13 | PB1 (=f/20000) // OC0B (=f/10) | 9 12 | PB0 (=f/10000) // GND | 10 11 | nc // |___________| // // Resulting frequencies: // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // XTAL1: 18MHz (from oszillator) // XCK0: 9MHz // OC0B: 1.8MHz // OC0A: 0.9MHz // OC1B: 180kHz // OC1A: 90kHz // PB5: 18kHz // PB6: 9kHz // PB0: 1.8kHz // PB1: 0.9kHz // 180Hz? // 90Hz? // 50Hz möglich? f/360000 (weil Netzfrequenz) // 60Hz möglich? f/300000 (weil Netzfrequenz) // Pins wären ja noch frei. // Program configuration .DEF Count = R17 .DEF USIcntReload = R18 // Start of application .ORG 0x0000 RJMP Init // USI Overflow ISR // NOTICE: This ISR is written inside the IVT and may need to be changed if other // interrupts are used in future. .ORG USI_OVFaddr OUT USISR, USIcntReload // <- IRQ each 5. edge, Flag clear SBI PINB, PB5 // toggle each edge SBIC PINB, PB5 RJMP Done // toggle each period SBI PINB, PB6 SUBI Count, 1 // each fifth BRNE Done LDI Count, 5 SBI PINB, PB0 // toggle SBIC PINB, PB0 SBI PINB, PB1 // ...period Done: RETI Init: // Setup Outputs (OC0B XCK) LDI R16, (1<<PD5)|(1<<PD2) OUT DDRD, R16 // Setup Outputs (f/2000, f/1000, OC1B, OC1A, OC0A, f/20000, f/10000) LDI R16, (1<<PB6)|(1<<PB5)|(1<<PB4)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0) OUT DDRB, R16 // Setup USI LDI R16, (1<<USIOIE)|(1<<USICS1) OUT USICR, R16 // each edge increments USI-conter, IRQ enabled LDI USIcntReload, (1<<USIOIF)|11 // Preload, Overflow-Flag has to be cleared manually OUT USISR, USIcntReload // <- IRQ each 5 edges // Setup Timer0 LDI R16, 4 // OC0B generates f/10 OUT OCR0B, R16 LDI R16, 9 // OC0A generates f/20 OUT OCR0A, R16 LDI R16, (1<<COM0A0)|(1<<COM0B1)|(1<<WGM01)|(1<<WGM00) // fast PWM - OC0A toggle, OC0B PWM OUT TCCR0A, R16 LDI R16, (1<<WGM02)|(1<<CS00) // fastPWM, prescaler=1 start OUT TCCR0B, R16 // Setup Timer1 LDI R16, HIGH(49) // OC1B generates f/100 OUT OCR1BH, R16 LDI R16, LOW(49) OUT OCR1BL, R16 LDI R16, LOW(99) // OC1A generates f/200 OUT OCR1AL, R16 LDI R16, (1<<COM1A0)|(1<<COM1B1)|(1<<WGM11)|(1<<WGM10) // fast PWM - OC1A toggle, OC1B PWM OUT TCCR1A, R16 LDI R16, (1<<WGM13)|(1<<WGM12)|(1<<CS10) // fastPWM, prescaler=1 start OUT TCCR1B, R16 // Setup USART (XCK0 generates f/2) LDI R16, (1<<TXEN)|(1<<UCSZ2) OUT UCSRB, R16 LDI R16, (1<<UMSEL0)|(1<<UCSZ1)|(1<<UCSZ0) OUT UCSRC, R16 LDI R16, 0 OUT UBRRL, R16 // Set software counter preload LDI Count, 5 // Enable interrupts SEI // RJMP Loop - Not required, it's the next sub. // Main application loop. May add WDR and SLEEP to it? Loop: RJMP Loop //End of file
AVRASM: AVR macro assembler 2.1.42 (build 1796 Sep 15 2009 10:48:36)
Copyright (C) 1995-2009 ATMEL Corporation
C:\Programmierung\ClockDividor\ClockDividor.asm(2): Including file 'C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn2313Adef.inc'
C:\Programmierung\ClockDividor\ClockDividor.asm(149): No EEPROM data, deleting C:\Programmierung\ClockDividor\ClockDividor.eep
ATtiny2313A memory use summary [bytes]:
Segment Begin End Code Data Used Size Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x00007e 96 0 96 2048 4.7%
[.dseg] 0x000060 0x000060 0 0 0 128 0.0%
[.eseg] 0x000000 0x000000 0 0 0 128 0.0%
Assembly complete, 0 errors. 0 warnings
Ja, XCK ohne die Null. Generell ist beim USART des Tn2313 da keine null (beim m88 hingegen schon, obwohl das da auch der einzige ist). Ich hab das als C&P-Fehler natürlich extra miteingebaut - ist ja schließlich ein Tiny2313Aheißt bei dem Chip wohl anders
Das hast Du schon gesehen?Der tiny wird ziemlich beleidigt sein
Die PWM-Ausgabe taktet den USI-Counter extern.f/200 -> B3 (OC1A) --> außerdem auf B7= USCK verbunden
// *************** Bugfixing tn2313Adef.inc **************** .INCLUDE <tn2313Adef.inc> .EQU UMSEL0 = 6 ; USART Mode Select Bit 0 .EQU UMSEL1 = 7 ; USART Mode Select Bit 1 // ********************************************************* // Project: ClockDividor 1.1 // ¯¯¯¯¯¯¯¯ // Description: The system clock gets devided into several frequencies. // ¯¯¯¯¯¯¯¯¯¯¯¯ See wireing for details. // A crystal oszillator (18MHz) is required on pin 5. // // Device: ATtiny2313A // ¯¯¯¯¯¯¯ // Fuses: 0xDF 0xDB 0xFF // ¯¯¯¯¯¯ // By: LotadaC (makerconnect.de) - initial developer // ¯¯¯ tightDev.Net - just a bit markup, added frequencies, project idea // // Wireing: // ¯¯¯¯¯¯¯¯ _____ _____ // |o U | // (ISP Reset/dW) |> 1 20 | VCC (5V) // PD0 (=f/100000) |< 2 19<| USCK - Conected to OC1A (ISP SCK) // nc (TxD, used by USI) |- 3 18>| PB6 (=f/2000), (ISP MISO) // nc (not usable) |- 4 17>| PB5 (=f/1000), (ISP MOSI) // XTAL1 (18MHz) |> 5 16>| OC1B (=f/100) // XCK (=f/2) |< 6 15>| OC1A (=f/200) // PD3 (=f/300000) |< 7 14>| OC0A (=f/20) // PD4 (=f/360000) |< 8 13>| PB1 (=f/20000) // OC0B (=f/10) |< 9 12>| PB0 (=f/10000) // GND | 10 11>| PD6 (=f/200000) // |___________| // // Resulting frequencies: // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // XTAL1: 18MHz (INPUT from oszillator) // XCK: 9MHz // OC0B: 1.8MHz // OC0A: 0.9MHz // OC1B: 180kHz // OC1A: 90kHz // PB5: 18kHz // PB6: 9kHz // PB0: 1.8kHz // PB1: 0.9kHz // PD0: 180Hz // PD6: 90Hz // PD4: 60Hz TODO // PD3: 50Hz TODO // // Power consumption: // ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ // Controller: 8.600 mA (without load) // Oscillator: 0.507 mA // Total: 9.107 mA // Program configuration .DEF Temp1 = R16 .DEF Count1 = R17 .DEF Count2 = R18 .DEF USIcntReload = R19 // Start of application .ORG 0x0000 RJMP Init // USI Overflow ISR // NOTICE: This ISR is written inside the IVT and may need to be changed if other // interrupts are used in future. .ORG USI_OVFaddr // IRQ each 5th edge, Clear flag OUT USISR, USIcntReload // Generate 18kHz (toggle each edge) SBI PINB, PB5 // Toggle pin SBIC PINB, PB5 // If low skip next command RJMP Done // Only each 2nd period, so below is f/2 // Generate 9kHz (toggle each 2nd period) SBI PINB, PB6 // Toggle pin SUBI Count1, 1 // Decrement Count1. If 0 Z flag is set BRNE Done // Only each 5th period, so below is f/5 // Generate 1.8kHz (each fifth from above, toggle) LDI Count1, 5 // Reload Count1 initial value for 18k/9k SBI PINB, PB0 // Toggle pin SBIC PINB, PB0 // If low skip next command RJMP Done // Only each 2nd period, so below is f/2 // Generate 900Hz (toggle each period) SBI PINB, PB1 // Toggle pin SUBI Count2, 1 // Decrement Count2. If 0 Z flag is set BRNE Done // Only each 5th period, so below is f/5 // Generate 180Hz (each fifth from above, toggle) LDI Count2, 5 // Reload Count2 initial value for 180/90 SBI PIND, PD0 // Toggle pin SBIC PIND, PD0 // If low skip next command RJMP Done // Only each 2nd period, so below is f/2 // Generate 900Hz (toggle each period) SBI PIND, PD6 // Toggle pin // no jump required, it's the exit // PD4 = 60hz // PD3 = 50hz Done: RETI // Program and chip initialization Init: // Setup Outputs (OC0B, XCK) LDI Temp1, (1<<PD5)|(1<<PD2) OUT DDRD, Temp1 // Setup Outputs A (f/20000) LDI Temp1, (1<<PA1) OUT DDRA, Temp1 // Setup Outputs B (f/2000, f/1000, OC1B, OC1A, OC0A, f/20000, f/10000) LDI Temp1, (1<<PB6)|(1<<PB5)|(1<<PB4)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0) OUT DDRB, Temp1 // Setup Outputs D (f/200000, f/360000, f/300000, f/100000) LDI Temp1, (1<<PD6)|(1<<PD4)|(1<<PD3)|(1<<PD0) OUT DDRD, Temp1 // Setup USI LDI Temp1, (1<<USIOIE)|(1<<USICS1) OUT USICR, Temp1 // each edge increments USI-conter, IRQ enabled LDI USIcntReload, (1<<USIOIF)|11 // Preload, Overflow-Flag has to be cleared manually OUT USISR, USIcntReload // <- IRQ each 5 edges // Setup Timer0 LDI Temp1, 4 // OC0B generates f/10 OUT OCR0B, Temp1 LDI Temp1, 9 // OC0A generates f/20 OUT OCR0A, Temp1 LDI Temp1, (1<<COM0A0)|(1<<COM0B1)|(1<<WGM01)|(1<<WGM00) // fast PWM - OC0A toggle, OC0B PWM OUT TCCR0A, Temp1 LDI Temp1, (1<<WGM02)|(1<<CS00) // fastPWM, prescaler=1 start OUT TCCR0B, Temp1 // Setup Timer1 LDI Temp1, HIGH(49) // OC1B generates f/100 OUT OCR1BH, Temp1 LDI Temp1, LOW(49) OUT OCR1BL, Temp1 LDI Temp1, LOW(99) // OC1A generates f/200 OUT OCR1AL, Temp1 LDI Temp1, (1<<COM1A0)|(1<<COM1B1)|(1<<WGM11)|(1<<WGM10) // fast PWM - OC1A toggle, OC1B PWM OUT TCCR1A, Temp1 LDI Temp1, (1<<WGM13)|(1<<WGM12)|(1<<CS10) // fastPWM, prescaler=1 start OUT TCCR1B, Temp1 // Setup USART (XCK0 generates f/2) LDI Temp1, (1<<TXEN)|(1<<UCSZ2) OUT UCSRB, Temp1 LDI Temp1, (1<<UMSEL0)|(1<<UCSZ1)|(1<<UCSZ0) OUT UCSRC, Temp1 LDI Temp1, 0 OUT UBRRL, Temp1 // Nothing to do in PRR, we use any component in there // Disable analog comperator (unused) LDI Temp1, (1<<ACD)|(1<<ACI) OUT ACSR, Temp1 // apply and wait 2 cycles NOP NOP OUT ACSR, Temp1 // twice to ensure no interrupt has fired // Setup sleep mode (idle) LDI Temp1, (1<<SE) OUT MCUCR, Temp1 // Setup the dog (0.25s) LDI Temp1, (1<<WDE)|(1<<WDP2) OUT WDTCSR, Temp1 // Set software counter preload LDI Count1, 5 LDI Count2, 5 // Enable interrupts SEI // RJMP Loop - Not required, it's the next sub. // Main application loop Loop: // Kick the dog WDR // Fall asleep (to save power) SLEEP // Restart application loop RJMP Loop //End of file
Ja, die stehen ja außerhalb der Kaskade, die mußt Du zwischen 100 und 101 einbauen. Der Teil wird mit 1800Hz ausgeführt. Du zählst zwei weitere Counter runter, und toggelst bei 18 (toggelt mit 100Hz =50Hz Frequenz) bzw 15 (toggelt mit 120Hz -> 60Hz)... subi Counter, brne nächster test, sbi Bein, reload Counter - zweimal das ganzeFehlen nur noch 50 und 60Hz.
PinA1 (XTAL2) scheint ebenfalls nicht nutzbar zu sein
Du hast Doch einen externen Quarzoszillator an XTAL1, hast Du auch als externe Clock gefused, oder als externer Crystal?Fuses: 0xDF 0xDB 0xFF