4 개의 배터리를 직렬로 연결하여 한 번에 하나씩 사용할 수있는 셀 밸런싱 기능이 있는 ATMEGA32HVB 마이크로 컨트롤러를 사용하고 있습니다. 전원 관리에 매우 유용하므로 다른 마이크로 컨트롤러를 사용할 수 없습니다. 직렬 장치에 쉽게 인터페이스 할 수 있도록 UART를 추가하는 방법을 제안하십시오.
4 개의 배터리를 직렬로 연결하여 한 번에 하나씩 사용할 수있는 셀 밸런싱 기능이 있는 ATMEGA32HVB 마이크로 컨트롤러를 사용하고 있습니다. 전원 관리에 매우 유용하므로 다른 마이크로 컨트롤러를 사용할 수 없습니다. 직렬 장치에 쉽게 인터페이스 할 수 있도록 UART를 추가하는 방법을 제안하십시오.
답변:
다른 사람들이 지적했듯이 UART 기능을 제공하기 위해 시스템에 추가 하드웨어를 추가하거나 소프트웨어에서 하드웨어를 에뮬레이션 할 수 있습니다. 전체 하드웨어 디자인을 제어하고 다른 IC를 추가하는 것이 옵션이라면 하드웨어 기반 접근 방식을 강력히 고려할 것입니다. bit-banging을 사용하여 소프트웨어 UART를 작동시킬 수는 있지만 필요한 타이밍을 생성하기 위해 CPU 리소스를 전용으로 사용하지 않을 수도 있습니다.
데이터 시트를 보면 마이크로 컨트롤러에는 SPI와 I2C (Atmel이 TWI (Two-Wire Interface)라고 함)가 모두있는 것으로 보입니다. 이들은 아마도 외부 UART를 연결하기 위해 사용할 수있는 가장 좋은 인터페이스 일 것입니다. 상기 장치는 다수의 제조사로부터 입수 가능하다. 몇 가지 예 :
Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts )에는 ~ 1.6-를 포괄하는 SPI / I2C 1 및 2 채널 UART 장치 라인이 있습니다 3.3V 작동 범위. 나는 이러한 부분을 특별히 사용하지는 않았지만 과거에는 병렬 메모리 버스 인터페이스와 함께 Exar 장치를 사용했으며 잘 작동했습니다.
NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ )에는 SPI / I2C UART / IrDA / GPIO 장치 라인이 있으며 1 및 2에서도 사용 가능합니다. 몇 가지 전압 범위에 대한-채널 종류. 나는 과거에이 부분들 (특히 SC16IS762)을 광범위하게 사용 해왔다.
Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 )에는 SPI 연결 UART 인 MAX3110E 및 MAX3111E 디바이스가 있습니다. 이 장치의 고유 한 기능 중 하나는 RS-232 라인 드라이버가 통합되어 있다는 것입니다. 따라서 로직 레벨 (예 : PC) 대신 RS-232 라인 전압을 사용하는 장치에 인터페이스하기 위해 UART가 필요한 경우 보드에 다른 라인 드라이버 IC를 추가하지 않아도되므로 유용 할 수 있습니다.
하드웨어 솔루션을 찾고 있다면 Maxim은 마이크로 컨트롤러에 대한 SPI 인터페이스 (여러 부분에 포함되어 있음)가있는 여러 UART IC를 보유하고 있습니다. 여기 MAX3100 또는 다른 옵션을 참조하십시오 : http://www.maximintegrated.com/products/interface/controllers-expanders/uart.cfm
소프트웨어 UART 드라이버를 사용해야합니다. 이 UART에서 기대하는 바에 따라 AVR305 (초소형이지만 반이중 전송 / 수신 차단 이외의 기능은 없음), AVR274 (인터럽트 구동, 상당히 완전한 기능)를 사용할 수 있으며, 고유 한 소프트웨어 UART 드라이버를 작성할 수 있습니다. 인터넷에서 찾은 것을 사용할 수 있습니다 (예 : 인터넷 검색 'avr software uart')
소프트웨어 "UART"디자인에 대한 간단한 참고 사항 : 요구 사항에 따라 최소한 질적으로 다르게 접근 할 수있는 방법이 있습니다.
"모든 것을 인계"하는 비트 뱅 드라이버는 모든 인터럽트를 비활성화하고 사이클 카운트 코드를 사용하여 각 비트를 클럭합니다. "모든 것을 인계"드라이버를 사용하여 데이터를 수신하려면 데이터가 도착할 때 컨트롤러가 대기 중일뿐입니다.
"메인 루프 인계"비트 뱅 드라이버는 사이클 카운팅이 아닌 비트 타이밍에 타이머 리소스를 사용한다는 점을 제외하면 위와 비슷하게 동작합니다. 서비스에 너무 오래 걸리지 않은 인터럽트는 활성화 된 상태로 남아있을 수 있습니다. 직렬 전송의 경우, 고정 속도 타이머 자원은 다른 목적과 공유 될 수있다. 그러나 직렬 수신의 경우 비트 뱅 드라이버는 시작 비트가 도착할 때 타이머를 다시로드하여 각 수신 비트 시간의 중간에 만료되도록해야합니다.
완전 인터럽트 구동 비트 뱅 드라이버는 고정 속도 타이머를 사용하여 데이터 속도의 일부 배수 (3 배와 5 배가 모두 4 배보다 낫다)로 실행되며 해당 타이머를 통해 모든 것을 수행합니다. 이러한 드라이버는 다른 모든 장치와 동시에 실행될 수 있지만 이전 드라이버 유형에 필요한 것보다 더 빠른 CPU가 필요합니다.
컨트롤러의 처음 두 가지 스타일이 절대로 올 수없는 데이터를 기다리지 않도록하려면 읽기 루틴에 시간 종료 값을 포함시키는 것이 일반적입니다. 만약 컨트롤러의 루프가 예를 들어 "100ms까지 기다리는 동안 바이트를 얻는다면, 아무것도 없으면 다른 일을하고 다음 바이트를 얻는다"등을 참고하십시오. "get"루틴이 시간 종료 된 시간과 컨트롤러가 다시 대기하기 시작하는 시간 사이에 바이트가 도착하면 해당 바이트가 손실됩니다. 통신하는 장치가 그 가능성을 예상해야합니다.
세 번째 스타일의 드라이버 만이 데이터 바이트가 전송되는 동안 데이터 바이트가 도착하기 시작하는 가능성을 처리 할 수 있습니다. 그러나 처음 두 스타일은 컨트롤러가 말을 할 때만 말해야하는 경우 전속 전이중 통신 프로토콜에 사용될 수 있습니다. 트릭은 들어오는 시작 비트를 기다리는 "읽기 및 쓰기 데이터"루틴을 가지고 있으며, 감지 된 비트가 감지 될 때 컨트롤러가 들어오는 데이터를 검사 할 때마다 각 비트를 보내도록 읽기 및 쓰기가 겹칩니다. 컨트롤러가 들어오는 시작 비트를 감지하면 다음 8 데이터 비트와 정지 비트를 언제 찾아야하는지 정확하게 알 수 있으므로 자체 데이터를 출력하기 위해 사이의 시간을 안전하게 사용할 수 있음을 알게됩니다.
한 가지 참고 사항 : 데이터를 수신하기 위해 처음 두 가지 스타일의 비트 뱅 uart 중 하나를 사용하는 컨트롤러는 데이터 손실을 피하기 위해 다음 바이트 시작 비트의 하강 에지 전에 각 바이트의 데이터를 처리해야합니다. 컨트롤러가 처리에 최소 비트 시간이 절반이 걸린다는 것을 알고 있으면 중지 비트를 기다리지 않고 마지막 데이터 비트를 가져 오자마자 각 바이트를 수락하여 처리 가능한 시간을 최대화 할 수 있습니다. 그러나 컨트롤러에 더 많은 시간을 제공하는 추가 수단으로, 데이터를 제공하는 장치가 하나가 아닌 2 개의 정지 비트로 전송되도록하는 것이 도움이 될 수 있습니다. "마크 패리티"를 구성 할 수 있으면 비트 시간이 더 추가됩니다. 예를 들어 115200-8-M-2에서의 전송은 데이터가 1.6 배 이상 빠른 데이터를 공급하더라도 57600-8-N-1보다 더 많은 처리 시간을 허용합니다.