繁体   English   中英

在没有PWM的AVR组件中生成方波

[英]Generating square wave in AVR Assembly without PWM

我正在使用ATmega328。 问题是我想生成给定频率和幅度的方波。 无法使用PWM,因为给了我一块已经焊接过的板,因此必须将波放在连接到处理器B端口的R2R电阻梯形的输出处。 因此,基本上,我的想法是我必须以给定的频率和50%的占空比周期性地将端口B的引脚置于0和VOLUME(VOLUME是从1到255的数字)。 并记住: NO PWM 频率应该能够每100 ms更改一次,但是我无法使该工作正常进行,因此我只是尝试生成一个恒定频率并首先查看会发生什么。

我的时钟为1MHz。 我写了以下代码:

.DSEG
.ORG 0x100

.CSEG
.ORG 0x100

;Initializing stack pointer
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16

MAIN:
CALL GENERATE ;Calling the generating routine
RJMP MAIN ;Repeat this forever

;I will generate a 440Hz frequency. It has an approximate period of 2273 microseconds
;This means that half a period stands for approximately 1136 clocks
GENERATE:
LDI R17, 0x70
LDI R18, 0x04   ;Half the period in hexadecimal is 0x0470
LDI R19, 243    ;Volume = 243 (arbitrary, it could be any number)
LDI R21, 88 ;The amount of half-periods in 100 ms (arbitrary election, too)

LDI R25, 0xFF
OUT DDRB, R25       ;Port B is an output port

LDI R24, 0xFF       ;R25R24 = 0xFFFF
CLC         ;Clean the carry
SBC R24, R17
SBC R25, R18        ;R25R24 = 0xFFFF - Halfperiod
ADIW R25:R24, 1     ;R25R24 = 0xFFFF - Halfperiod +1
OUT PORTB, R18      ;The wave starts at 0

BEGIN:
CALL LOOP_1
EOR R19, R19        ;It varies between 0 and volume
OUT PORTB, R19      ;It puts the output to the actual value of R19 (0 or volume)
CLZ         ;Clean Z flag
DEC R21
BREQ END        ;When 100ms have passed, generation is over
JMP BEGIN       ;If not, generation continues

LOOP_1: STS TCNT1H, R25
STS TCNT1L, R24     ;Loading the amount of clocks the timer has to count
LDI R16, 0x00
STS TCCR1A, R16
LDI R16, 0x01
STS TCCR1B, R16     ;Timer operating in normal mode, no prescaler
LOOP_2: IN R16, TIFR1
SBRS R16, TOV1      ;If timer's over, skip the next jump
JMP LOOP_2
LDI R16, 0x00
STS TCCR1B, R16     ;Stopping the timer
LDI R16, 0x04
OUT TIFR1, R16      ;Clean TOV1
RET         ;Back to BEGIN

END:
RET         ;Back to MAIN

这是我最早的组装方法之一,因此阅读起来可能很难看。 该代码当前无法正常工作。 有任何想法吗?

编辑:

感谢Spektre向我指出了这一点,我更正了上面的一部分代码。 代码是一样的,除了

GENERATE:
.
.
.
LDI R21, 44 ;The amount of PERIODS (not half-periods as before) in 100 ms
.
.
.
BEGIN:
OUT PORTB, R18      ;This was before the BEGIN tag, now it is after it
CALL LOOP_1     ;It counts a halfperiod with output=0
OUT PORTB, R19      ;Now output=volume
CALL LOOP_1     ;It counts a halfperiod with output=volume
CLZ         ;Clean Z Flag
DEC R21
BREQ END        ;When 100ms have passed, generation is over
JMP BEGIN       ;If not, generation continues

多年来,我已经为这种体系结构做过一些事情……我使用的是UC3 (后继产品),在MCU的 66 MHz时钟上,我可以达到2-5 MHz轮询频率。 但恐怕在您的Target平台上,价格会低很多。 因此,首先测量轮询频率以查看硬件的限制。

1 MHz是输出时钟还是MCU时钟? 您需要在输出上具有什么最大频率?

还有很多方法可以实现这一目标:

  1. 定时器/计数器

    您可以为例如1 us设置Timer并在那里进行计时和切换。 或者,您可以使用它来设置新频率。 但是请注意,任何中断都可能导致输出信号中的时序问题,例如抖动。如果有足够的时间可以避免这些情况,但通常会大大限制最大输出频率。

  2. 主线程轮询

    看来这就是您在做什么。 但是您会忘记所有的说明都有自己的时间安排。 而且条件可以有不同的时间安排,因此您应该补偿。

  3. 开发接口(如果有)

    查看数据表,查看是否有任何硬件连接到该端口。 MCU通常在引脚上复用了更多功能,有时可以利用它们。 例如,我曾经利用串行接口,DMA + ABI / SD卡接口来制作VGA图像生成器。 每种方法都能正确产生16种彩色VGA信号,但在同一芯片和引脚上具有完全不同的代码和硬件架构...为了与您的具有20 MHz时钟的ATMega168平台(与ATMega328内核相同)进行比较,我能够产生用于LCD的1位 LCD 640x480信号(比彩色VGA信号要低很多倍)。 有时您甚至可以在运行时更改引脚的含义...例如,要实现100 000 rpm BLDC控制器,我需要改变内部电路几次和电机的电气周期,以便能够产生如此高的速度(否则无法实现)通过直接手段。

您需要试验哪种方法对您足够快速/准确/舒适。 从您的代码初看时,我偶然发现了这一点:

EOR R19, R19        ;It varies between 0 and volume
OUT PORTB, R19      ;It puts the output to the actual value of R19 (0 or volume)

如果我没看错,您是对R19R19进行XOR运算 ... ...第一次通过后销毁了R19的内容。 因此,您一直在向B端口输出0

XOR Volume,Volume -> Volume = 0
XOR 0,0  -> 0

相反,我会:

  1. 出港量
  2. 等待一半
  3. 出零端口
  4. 等待一半
  5. 如果达到100ms的更改频率
  6. 转到#1

您应该尽可能少地使用端口访问。 不确定ATMega是否也是这种情况,但在较新的体系结构上,该端口可通过硬件接口/ API访问,如果不明智地 使用 ,则对于高速切换来说确实很慢。

PS。

希望您的R2R阶梯在输入电阻器或至少PORTB的集电极开路输出之前具有二极管,否则如果相邻引脚之间的电流都设置为不同的值,则它将无法工作。

[Edit1]一些澄清

  1. 更清楚地了解R2R当前问题

    R2R

    二极管应具有相同的PN势垒电压!

  2. 1MHz时钟

    您写道I'm running the clock at 1MHz但没有弄清楚它是MCU / CPU时钟,定时器时钟还是输出方波信号频率。 现在很明显,您的输出信号为<130,523> Hz ,应该可以在您的平台上轻松实现。 之前我不确定...我甚至在MCU的30 MHz左右都生成过信号,因此1 MHz是可能的。

  3. 定时

    在大多数平台上,诸如BREQ END类的条件指令在条件为真和为假时具有不同的时序,因此要保持同步性,您应该考虑到这一点……有时放置得当的nop可以处理问题……如果是这样的话,文档。

    您说您正在使用计数器/计时器,但在您的代码中看不到。 为了正确使用,您应该

    1. 为您想要的模式和频率配置硬件
    2. 注册中断子程序
    3. 启用中断和/或触发计时器计数器事件...
    4. 内部中断事件处理程序

      如果需要,可重置计数器值,并清除中断标志,以便可能发生另一个事件。 如果您接近芯片功能的边缘,有时甚至需要为正确的时间校正计数器值。

    我看到的是一些计时器/计数器的配置,因为我长时间不使用该平台,因此不确定是否做得正确。 我在任何地方都看不到中断处理程序子例程……可能您正在轮询计数器寄存器,但又不确定这是否是正确的方法(并非所有HW寄存器都可读),因此您应该面对文档。 但是无论如何它都是轮询的,所以授课的时间很重要...

如果有帮助,我可以为ATMega168挖掘一个古老的生成器(在PortC上生成方波)的asm代码:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; generator ver: 0.00 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*
CPU:    ATMega168 8MHz internal RC

OUT:    PC
*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ATMega168 startup: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; fuses:BOOTRST=1 disabled
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        .equ stack  =0x04FF
        .equ cpuclk =8000000
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        .device ATmega168   ; device selection
        .equ PINB  =0x03    ; IO reg adresses definition in/out
        .equ DDRB  =0x04
        .equ PORTB =0x05
        .equ PINC  =0x06
        .equ DDRC  =0x07
        .equ PORTC =0x08
        .equ PIND  =0x09
        .equ DDRD  =0x0A
        .equ PORTD =0x0B
        .equ TIFR0 =0x15
        .equ TIFR1 =0x16
        .equ TIFR2 =0x17
        .equ PCIFR =0x1B
        .equ EIFR  =0x1C
        .equ EIMSK =0x1D
        .equ GPIOR0=0x1E
        .equ EECR  =0x1F
        .equ EEDR  =0x20
        .equ EEARL =0x21
        .equ EEARH =0x22
        .equ GTCCR =0x23
        .equ TCCROA=0x24
        .equ TCCROB=0x25
        .equ TCNT0 =0x26
        .equ OCROA =0x27
        .equ OCROB =0x28
        .equ GPIOR1=0x2A
        .equ GPIOR2=0x2B
        .equ SPCR  =0x2C
        .equ SPSR  =0x2D
        .equ SPDR  =0x2E
        .equ ACSR  =0x30
        .equ SMCR  =0x33
        .equ MCUSR =0x34
        .equ MCUCR =0x35    
        .equ SPMCSR=0x37
        .equ SPL   =0x3D
        .equ SPH   =0x3E
        .equ SREG  =0x3F

        .equ WDTCSR=0x60    ; sts,lds
        .equ CLKPR =0x61
        .equ PRR   =0x64
        .equ OSCCAL=0x66
        .equ PCICR =0x68
        .equ EICRA =0x69
        .equ PCMSK0=0x6B
        .equ PCMSK1=0x6C
        .equ PCMSK2=0x6D
        .equ TIMSK0=0x6E
        .equ TIMSK1=0x6F
        .equ TIMSK2=0x70
        .equ ADCL  =0x78
        .equ ADCH  =0x79
        .equ ADCSRA=0x7A
        .equ ADCSRB=0x7B
        .equ ADMUX =0x7C
        .equ DIDR0 =0x7E
        .equ DIDR1 =0x7F
        .equ TCCR1A=0x80
        .equ TCCR1B=0x81
        .equ TCCR1C=0x82
        .equ TCNT1L=0x84
        .equ TCNT1H=0x85
        .equ ICR1L =0x86
        .equ ICR1H =0x87
        .equ OCR1AL=0x88
        .equ OCR1AH=0x89
        .equ OCR1BL=0x8A
        .equ OCR1BH=0x8B
        .equ TCCR2A=0xB0
        .equ TCCR2B=0xB1
        .equ TCNT2 =0xB2
        .equ OCR2A =0xB3
        .equ ASSR  =0xB6
        .equ TWBR  =0xB8
        .equ TWSR  =0xB9
        .equ TWAR  =0xBA
        .equ TWDR  =0xBB
        .equ TWCR  =0xBC
        .equ TWAMR =0xBD
        .equ UCSR0A=0xC0
        .equ UCSR0B=0xC1
        .equ UCSR0C=0xC2
        .equ UBRR0L=0xC4
        .equ UBRR0H=0xC5
        .equ UDR0  =0xC6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
        .cseg           ; Start of code segment
        .org 0x0000     ; interrupts, highest priority first
        jmp RESET       ; 3 Reset Handler
        jmp EXT_INT0    ; 3 IRQ0 Handler
        jmp EXT_INT1    ; 3 IRQ1 Handler
        jmp PCINT0      ; 3 PCINT0 Handler
        jmp PCINT1      ; 3 PCINT1 Handler
        jmp PCINT2      ; 3 PCINT2 Handler
        jmp WDT         ; 3 Watchdog Timer Handler
        jmp TIM2_COMPA  ; 3 Timer2 Compare A Handler
        jmp TIM2_COMPB  ; 3 Timer2 Compare B Handler
        jmp TIM2_OVF    ; 3 Timer2 Overflow Handler
        jmp TIM1_CAPT   ; 3 Timer1 Capture Handler
        jmp TIM1_COMPA  ; 3 Timer1 Compare A Handler
        jmp TIM1_COMPB  ; 3 Timer1 Compare B Handler
        jmp TIM1_OVF    ; 3 Timer1 Overflow Handler
        jmp TIM0_COMPA  ; 3 Timer0 Compare A Handler
        jmp TIM0_COMPB  ; 3 Timer0 Compare B Handler
        jmp TIM0_OVF    ; 3 Timer0 Overflow Handler
        jmp SPI_STC     ; 3 SPI Transfer Complete Handler
        jmp USART_RXC   ; 3 USART, RX Complete Handler
        jmp USART_UDRE  ; 3 USART, UDR Empty Handler
        jmp USART_TXC   ; 3 USART, TX Complete Handler
        jmp ADC_DONE    ; 3 ADC Conversion Complete Handler
        jmp EE_RDY      ; 3 EEPROM Ready Handler
        jmp ANA_COMP    ; 3 Analog Comparator Handler
        jmp TWI         ; 3 2-wire Serial Interface Handler
        jmp SPM_RDY     ; 3 Store Program Memory Ready Handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
RESET:  cli             ; Reset Handler
        ldi  r16,high(stack)
        out  SPH,r16
        ldi  r16,low(stack)
        out  SPL,r16

        ldi  r16, 0xFF  ; DDRB 1 - output, 0 - input direction
        out  DDRB, r16
        ldi  r16, 0xFF  ; DDRC 1 - output, 0 - input direction
        out  DDRC, r16
        ldi  r16, 0xFF  ; DDRD 1 - output, 0 - input direction
        out  DDRD, r16

        ldi  r16, 0xFF  ; all outputs high,and all inputs Pull Up to Ucc
        out  PORTB,r16
        out  PORTC,r16
        out  PORTD,r16
        jmp  main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
EXT_INT0:               ; IRQ0 Handler
        reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
EXT_INT1:               ; IRQ1 Handler
        reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
PCINT0:                 ; PCINT0 Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
PCINT1:                 ; PCINT1 Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
PCINT2:                 ; PCINT2 Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
WDT:                    ; Watchdog Timer Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM2_COMPA:             ; Timer2 Compare A Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM2_COMPB:             ; Timer2 Compare B Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM2_OVF:               ; Timer2 Overflow Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM1_CAPT:              ; Timer1 Capture Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM1_COMPA:             ; Timer1 Compare A Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM1_COMPB:             ; Timer1 Compare B Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM1_OVF:               ; Timer1 Overflow Handler 
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM0_COMPA:             ; Timer0 Compare A Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM0_COMPB:             ; Timer0 Compare B Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TIM0_OVF:               ; Timer0 Overflow Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
SPI_STC:                ; SPI Transfer Complete Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
USART_RXC:              ; USART, RX Complete Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
USART_UDRE:             ; USART, UDR Empty Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
USART_TXC:              ; USART, TX Complete Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
ADC_DONE:               ; ADC Conversion Complete Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
EE_RDY:                 ; EEPROM Ready Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
ANA_COMP:               ; Analog Comparator Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
TWI:                    ; 2-wire Serial Interface Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
SPM_RDY:                ; Store Program Memory Ready Handler
        reti            ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
main:   ldi  r16,0

main0:  out  PORTC,r16  ; 1 8T / 8MHz = 1MHz PC0, 0.5MHz PC1, ...
        inc  r16        ; 1
        nop             ; 1
        nop             ; 1
        nop             ; 1
        nop             ; 1
        rjmp main0      ; 2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
waitms: push r31        ; 2 wait cca r31 [ms] +(15+r31*4)T
        push r30        ; 2
        push r29        ; 2
waitms2:ldi  r30,cpuclk/200000;1 1ms
waitms1:ldi  r29,49     ; 1     200T
waitms0:nop             ; 1
        dec  r29        ; 1
        brne waitms0    ; 2/1
        dec  r30        ; 1
        brne waitms1    ; 2/1
        dec  r31        ; 1
        brne waitms2    ; 2/1
        pop  r29        ; 2
        pop  r30        ; 2
        pop  r31        ; 2
        ret             ; 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ID: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; end. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

这是我当时用于这些设备的标准模板...看一下waitms子例程,它等待的时间尽可能接近r31 [ms] 存在指令的时序,是的,条件指令在该芯片上具有不同的时序。 由于ATMega328具有相同的内核,因此对于您的芯片也相同。

呵呵,我的带C ++示波器的ATMega模拟器仍然可以在Win7上运行...(现在不确定是在w9x或w2k上编写)(与从我发布的源中编译的十六进制一起使用)。

模拟器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM